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