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