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