package net.minecraft.entity.player; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import net.minecraft.crash.CrashReport; import net.minecraft.crash.CrashReportCategory; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLiving; import net.minecraft.entity.IMerchant; import net.minecraft.entity.item.EntityMinecartHopper; import net.minecraft.entity.projectile.EntityArrow; import net.minecraft.inventory.Container; import net.minecraft.inventory.ContainerBeacon; import net.minecraft.inventory.ContainerBrewingStand; import net.minecraft.inventory.ContainerChest; import net.minecraft.inventory.ContainerDispenser; import net.minecraft.inventory.ContainerEnchantment; import net.minecraft.inventory.ContainerFurnace; import net.minecraft.inventory.ContainerHopper; import net.minecraft.inventory.ContainerMerchant; import net.minecraft.inventory.ContainerRepair; import net.minecraft.inventory.ContainerWorkbench; import net.minecraft.inventory.ICrafting; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.InventoryMerchant; import net.minecraft.inventory.SlotCrafting; import net.minecraft.item.EnumAction; import net.minecraft.item.Item; import net.minecraft.item.ItemInWorldManager; import net.minecraft.item.ItemMapBase; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.NetServerHandler; import net.minecraft.network.packet.Packet; import net.minecraft.network.packet.Packet100OpenWindow; import net.minecraft.network.packet.Packet101CloseWindow; import net.minecraft.network.packet.Packet103SetSlot; import net.minecraft.network.packet.Packet104WindowItems; import net.minecraft.network.packet.Packet105UpdateProgressbar; import net.minecraft.network.packet.Packet17Sleep; import net.minecraft.network.packet.Packet18Animation; import net.minecraft.network.packet.Packet200Statistic; import net.minecraft.network.packet.Packet202PlayerAbilities; import net.minecraft.network.packet.Packet204ClientInfo; import net.minecraft.network.packet.Packet250CustomPayload; import net.minecraft.network.packet.Packet29DestroyEntity; import net.minecraft.network.packet.Packet38EntityStatus; import net.minecraft.network.packet.Packet39AttachEntity; import net.minecraft.network.packet.Packet3Chat; import net.minecraft.network.packet.Packet41EntityEffect; import net.minecraft.network.packet.Packet42RemoveEntityEffect; import net.minecraft.network.packet.Packet43Experience; import net.minecraft.network.packet.Packet56MapChunks; import net.minecraft.network.packet.Packet70GameEvent; import net.minecraft.network.packet.Packet8UpdateHealth; import net.minecraft.potion.PotionEffect; import net.minecraft.scoreboard.Score; import net.minecraft.scoreboard.ScoreObjective; import net.minecraft.scoreboard.ScoreObjectiveCriteria; import net.minecraft.server.MinecraftServer; import net.minecraft.stats.AchievementList; import net.minecraft.stats.StatBase; import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityBeacon; import net.minecraft.tileentity.TileEntityBrewingStand; import net.minecraft.tileentity.TileEntityDispenser; import net.minecraft.tileentity.TileEntityDropper; import net.minecraft.tileentity.TileEntityFurnace; import net.minecraft.tileentity.TileEntityHopper; import net.minecraft.util.ChunkCoordinates; import net.minecraft.util.DamageSource; import net.minecraft.util.EntityDamageSource; import net.minecraft.util.MathHelper; import net.minecraft.util.ReportedException; import net.minecraft.util.StringTranslate; import net.minecraft.village.MerchantRecipeList; import net.minecraft.world.ChunkCoordIntPair; import net.minecraft.world.EnumGameType; import net.minecraft.world.World; import net.minecraft.world.WorldServer; import net.minecraft.world.chunk.Chunk; import net.minecraft.entity.item.EntityItem; import net.minecraftforge.common.ForgeHooks; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.entity.player.PlayerDropsEvent; import net.minecraftforge.event.world.ChunkWatchEvent; public class EntityPlayerMP extends EntityPlayer implements ICrafting { private StringTranslate translator = new StringTranslate("en_US"); /** * The NetServerHandler assigned to this player by the ServerConfigurationManager. */ public NetServerHandler playerNetServerHandler; /** Reference to the MinecraftServer object. */ public MinecraftServer mcServer; /** The ItemInWorldManager belonging to this player */ public ItemInWorldManager theItemInWorldManager; /** player X position as seen by PlayerManager */ public double managedPosX; /** player Z position as seen by PlayerManager */ public double managedPosZ; /** LinkedList that holds the loaded chunks. */ public final List loadedChunks = new LinkedList(); /** entities added to this list will be packet29'd to the player */ public final List destroyedItemsNetCache = new LinkedList(); /** set to getHealth */ private int lastHealth = -99999999; /** set to foodStats.GetFoodLevel */ private int lastFoodLevel = -99999999; /** set to foodStats.getSaturationLevel() == 0.0F each tick */ private boolean wasHungry = true; /** Amount of experience the client was last set to */ private int lastExperience = -99999999; /** de-increments onUpdate, attackEntityFrom is ignored if this >0 */ private int initialInvulnerability = 60; /** must be between 3>x>15 (strictly between) */ private int renderDistance = 0; private int chatVisibility = 0; private boolean chatColours = true; /** * The currently in use window ID. Incremented every time a window is opened. */ public int currentWindowId = 0; /** * poor mans concurency flag, lets hope the jvm doesn't re-order the setting of this flag wrt the inventory change * on the next line */ public boolean playerInventoryBeingManipulated; public int ping; /** * Set when a player beats the ender dragon, used to respawn the player at the spawn point while retaining inventory * and XP */ public boolean playerConqueredTheEnd = false; public EntityPlayerMP(MinecraftServer par1MinecraftServer, World par2World, String par3Str, ItemInWorldManager par4ItemInWorldManager) { super(par2World); par4ItemInWorldManager.thisPlayerMP = this; this.theItemInWorldManager = par4ItemInWorldManager; this.renderDistance = par1MinecraftServer.getConfigurationManager().getViewDistance(); ChunkCoordinates chunkcoordinates = par2World.provider.getRandomizedSpawnPoint(); int i = chunkcoordinates.posX; int j = chunkcoordinates.posZ; int k = chunkcoordinates.posY; this.mcServer = par1MinecraftServer; this.stepHeight = 0.0F; this.username = par3Str; this.yOffset = 0.0F; this.setLocationAndAngles((double)i + 0.5D, (double)k, (double)j + 0.5D, 0.0F, 0.0F); while (!par2World.getCollidingBoundingBoxes(this, this.boundingBox).isEmpty()) { this.setPosition(this.posX, this.posY + 1.0D, this.posZ); } } /** * (abstract) Protected helper method to read subclass entity data from NBT. */ public void readEntityFromNBT(NBTTagCompound par1NBTTagCompound) { super.readEntityFromNBT(par1NBTTagCompound); if (par1NBTTagCompound.hasKey("playerGameType")) { if (MinecraftServer.getServer().func_104056_am()) { this.theItemInWorldManager.setGameType(MinecraftServer.getServer().getGameType()); } else { this.theItemInWorldManager.setGameType(EnumGameType.getByID(par1NBTTagCompound.getInteger("playerGameType"))); } } } /** * (abstract) Protected helper method to write subclass entity data to NBT. */ public void writeEntityToNBT(NBTTagCompound par1NBTTagCompound) { super.writeEntityToNBT(par1NBTTagCompound); par1NBTTagCompound.setInteger("playerGameType", this.theItemInWorldManager.getGameType().getID()); } /** * Add experience levels to this player. */ public void addExperienceLevel(int par1) { super.addExperienceLevel(par1); this.lastExperience = -1; } public void addSelfToInternalCraftingInventory() { this.openContainer.addCraftingToCrafters(this); } /** * sets the players height back to normal after doing things like sleeping and dieing */ protected void resetHeight() { this.yOffset = 0.0F; } public float getEyeHeight() { return 1.62F; } /** * Called to update the entity's position/logic. */ public void onUpdate() { this.theItemInWorldManager.updateBlockRemoving(); --this.initialInvulnerability; this.openContainer.detectAndSendChanges(); while (!this.destroyedItemsNetCache.isEmpty()) { int i = Math.min(this.destroyedItemsNetCache.size(), 127); int[] aint = new int[i]; Iterator iterator = this.destroyedItemsNetCache.iterator(); int j = 0; while (iterator.hasNext() && j < i) { aint[j++] = ((Integer)iterator.next()).intValue(); iterator.remove(); } this.playerNetServerHandler.sendPacketToPlayer(new Packet29DestroyEntity(aint)); } if (!this.loadedChunks.isEmpty()) { ArrayList arraylist = new ArrayList(); Iterator iterator1 = this.loadedChunks.iterator(); ArrayList arraylist1 = new ArrayList(); while (iterator1.hasNext() && arraylist.size() < 5) { ChunkCoordIntPair chunkcoordintpair = (ChunkCoordIntPair)iterator1.next(); iterator1.remove(); if (chunkcoordintpair != null && this.worldObj.blockExists(chunkcoordintpair.chunkXPos << 4, 0, chunkcoordintpair.chunkZPos << 4)) { arraylist.add(this.worldObj.getChunkFromChunkCoords(chunkcoordintpair.chunkXPos, chunkcoordintpair.chunkZPos)); //BugFix: 16 makes it load an extra chunk, which isn't associated with a player, which makes it not unload unless a player walks near it. //ToDo: Find a way to efficiently clean abandoned chunks. //arraylist1.addAll(((WorldServer)this.worldObj).getAllTileEntityInBox(chunkcoordintpair.chunkXPos * 16, 0, chunkcoordintpair.chunkZPos * 16, chunkcoordintpair.chunkXPos * 16 + 16, 256, chunkcoordintpair.chunkZPos * 16 + 16)); arraylist1.addAll(((WorldServer)this.worldObj).getAllTileEntityInBox(chunkcoordintpair.chunkXPos * 16, 0, chunkcoordintpair.chunkZPos * 16, chunkcoordintpair.chunkXPos * 16 + 15, 256, chunkcoordintpair.chunkZPos * 16 + 15)); } } if (!arraylist.isEmpty()) { this.playerNetServerHandler.sendPacketToPlayer(new Packet56MapChunks(arraylist)); Iterator iterator2 = arraylist1.iterator(); while (iterator2.hasNext()) { TileEntity tileentity = (TileEntity)iterator2.next(); this.sendTileEntityToPlayer(tileentity); } iterator2 = arraylist.iterator(); while (iterator2.hasNext()) { Chunk chunk = (Chunk)iterator2.next(); this.getServerForPlayer().getEntityTracker().func_85172_a(this, chunk); MinecraftForge.EVENT_BUS.post(new ChunkWatchEvent.Watch(chunk.getChunkCoordIntPair(), this)); } } } } public void setEntityHealth(int par1) { super.setEntityHealth(par1); Collection collection = this.getWorldScoreboard().func_96520_a(ScoreObjectiveCriteria.field_96638_f); Iterator iterator = collection.iterator(); while (iterator.hasNext()) { ScoreObjective scoreobjective = (ScoreObjective)iterator.next(); this.getWorldScoreboard().func_96529_a(this.getEntityName(), scoreobjective).func_96651_a(Arrays.asList(new EntityPlayer[] {this})); } } public void onUpdateEntity() { try { super.onUpdate(); for (int i = 0; i < this.inventory.getSizeInventory(); ++i) { ItemStack itemstack = this.inventory.getStackInSlot(i); if (itemstack != null && Item.itemsList[itemstack.itemID].isMap() && this.playerNetServerHandler.packetSize() <= 5) { Packet packet = ((ItemMapBase)Item.itemsList[itemstack.itemID]).createMapDataPacket(itemstack, this.worldObj, this); if (packet != null) { this.playerNetServerHandler.sendPacketToPlayer(packet); } } } if (this.getHealth() != this.lastHealth || this.lastFoodLevel != this.foodStats.getFoodLevel() || this.foodStats.getSaturationLevel() == 0.0F != this.wasHungry) { this.playerNetServerHandler.sendPacketToPlayer(new Packet8UpdateHealth(this.getHealth(), this.foodStats.getFoodLevel(), this.foodStats.getSaturationLevel())); this.lastHealth = this.getHealth(); this.lastFoodLevel = this.foodStats.getFoodLevel(); this.wasHungry = this.foodStats.getSaturationLevel() == 0.0F; } if (this.experienceTotal != this.lastExperience) { this.lastExperience = this.experienceTotal; this.playerNetServerHandler.sendPacketToPlayer(new Packet43Experience(this.experience, this.experienceTotal, this.experienceLevel)); } } catch (Throwable throwable) { CrashReport crashreport = CrashReport.makeCrashReport(throwable, "Ticking player"); CrashReportCategory crashreportcategory = crashreport.makeCategory("Player being ticked"); this.func_85029_a(crashreportcategory); throw new ReportedException(crashreport); } } /** * Called when the mob's health reaches 0. */ public void onDeath(DamageSource par1DamageSource) { if (ForgeHooks.onLivingDeath(this, par1DamageSource)) { return; } this.mcServer.getConfigurationManager().sendChatMsg(this.field_94063_bt.func_94546_b()); if (!this.worldObj.getGameRules().getGameRuleBooleanValue("keepInventory")) { captureDrops = true; capturedDrops.clear(); this.inventory.dropAllItems(); captureDrops = false; PlayerDropsEvent event = new PlayerDropsEvent(this, par1DamageSource, capturedDrops, recentlyHit > 0); if (!MinecraftForge.EVENT_BUS.post(event)) { for (EntityItem item : capturedDrops) { joinEntityItemWithWorld(item); } } } Collection collection = this.worldObj.getScoreboard().func_96520_a(ScoreObjectiveCriteria.field_96642_c); Iterator iterator = collection.iterator(); while (iterator.hasNext()) { ScoreObjective scoreobjective = (ScoreObjective)iterator.next(); Score score = this.getWorldScoreboard().func_96529_a(this.getEntityName(), scoreobjective); score.func_96648_a(); } EntityLiving entityliving = this.func_94060_bK(); if (entityliving != null) { entityliving.addToPlayerScore(this, this.scoreValue); } } /** * Called when the entity is attacked. */ public boolean attackEntityFrom(DamageSource par1DamageSource, int par2) { if (this.isEntityInvulnerable()) { return false; } else { boolean flag = this.mcServer.isDedicatedServer() && this.mcServer.isPVPEnabled() && "fall".equals(par1DamageSource.damageType); if (!flag && this.initialInvulnerability > 0 && par1DamageSource != DamageSource.outOfWorld) { return false; } else { if (par1DamageSource instanceof EntityDamageSource) { Entity entity = par1DamageSource.getEntity(); if (entity instanceof EntityPlayer && !this.func_96122_a((EntityPlayer)entity)) { return false; } if (entity instanceof EntityArrow) { EntityArrow entityarrow = (EntityArrow)entity; if (entityarrow.shootingEntity instanceof EntityPlayer && !this.func_96122_a((EntityPlayer)entityarrow.shootingEntity)) { return false; } } } return super.attackEntityFrom(par1DamageSource, par2); } } } public boolean func_96122_a(EntityPlayer par1EntityPlayer) { return !this.mcServer.isPVPEnabled() ? false : super.func_96122_a(par1EntityPlayer); } /** * Teleports the entity to another dimension. Params: Dimension number to teleport to */ public void travelToDimension(int par1) { if (this.dimension == 1 && par1 == 1) { this.triggerAchievement(AchievementList.theEnd2); this.worldObj.removeEntity(this); this.playerConqueredTheEnd = true; this.playerNetServerHandler.sendPacketToPlayer(new Packet70GameEvent(4, 0)); } else { if (this.dimension == 1 && par1 == 0) { this.triggerAchievement(AchievementList.theEnd); ChunkCoordinates chunkcoordinates = this.mcServer.worldServerForDimension(par1).getEntrancePortalLocation(); if (chunkcoordinates != null) { this.playerNetServerHandler.setPlayerLocation((double)chunkcoordinates.posX, (double)chunkcoordinates.posY, (double)chunkcoordinates.posZ, 0.0F, 0.0F); } par1 = 1; } else { this.triggerAchievement(AchievementList.portal); } this.mcServer.getConfigurationManager().transferPlayerToDimension(this, par1); this.lastExperience = -1; this.lastHealth = -1; this.lastFoodLevel = -1; } } /** * called from onUpdate for all tileEntity in specific chunks */ private void sendTileEntityToPlayer(TileEntity par1TileEntity) { if (par1TileEntity != null) { Packet packet = par1TileEntity.getDescriptionPacket(); if (packet != null) { this.playerNetServerHandler.sendPacketToPlayer(packet); } } } /** * Called whenever an item is picked up from walking over it. Args: pickedUpEntity, stackSize */ public void onItemPickup(Entity par1Entity, int par2) { super.onItemPickup(par1Entity, par2); this.openContainer.detectAndSendChanges(); } /** * Attempts to have the player sleep in a bed at the specified location. */ public EnumStatus sleepInBedAt(int par1, int par2, int par3) { EnumStatus enumstatus = super.sleepInBedAt(par1, par2, par3); if (enumstatus == EnumStatus.OK) { Packet17Sleep packet17sleep = new Packet17Sleep(this, 0, par1, par2, par3); this.getServerForPlayer().getEntityTracker().sendPacketToAllPlayersTrackingEntity(this, packet17sleep); this.playerNetServerHandler.setPlayerLocation(this.posX, this.posY, this.posZ, this.rotationYaw, this.rotationPitch); this.playerNetServerHandler.sendPacketToPlayer(packet17sleep); } return enumstatus; } /** * Wake up the player if they're sleeping. */ public void wakeUpPlayer(boolean par1, boolean par2, boolean par3) { if (this.isPlayerSleeping()) { this.getServerForPlayer().getEntityTracker().sendPacketToAllAssociatedPlayers(this, new Packet18Animation(this, 3)); } super.wakeUpPlayer(par1, par2, par3); if (this.playerNetServerHandler != null) { this.playerNetServerHandler.setPlayerLocation(this.posX, this.posY, this.posZ, this.rotationYaw, this.rotationPitch); } } /** * Called when a player mounts an entity. e.g. mounts a pig, mounts a boat. */ public void mountEntity(Entity par1Entity) { super.mountEntity(par1Entity); this.playerNetServerHandler.sendPacketToPlayer(new Packet39AttachEntity(this, this.ridingEntity)); this.playerNetServerHandler.setPlayerLocation(this.posX, this.posY, this.posZ, this.rotationYaw, this.rotationPitch); } /** * Takes in the distance the entity has fallen this tick and whether its on the ground to update the fall distance * and deal fall damage if landing on the ground. Args: distanceFallenThisTick, onGround */ protected void updateFallState(double par1, boolean par3) {} /** * likeUpdateFallState, but called from updateFlyingState, rather than moveEntity */ public void updateFlyingState(double par1, boolean par3) { super.updateFallState(par1, par3); } public void incrementWindowID() { this.currentWindowId = this.currentWindowId % 100 + 1; } /** * Displays the crafting GUI for a workbench. */ public void displayGUIWorkbench(int par1, int par2, int par3) { this.incrementWindowID(); this.playerNetServerHandler.sendPacketToPlayer(new Packet100OpenWindow(this.currentWindowId, 1, "Crafting", 9, true)); this.openContainer = new ContainerWorkbench(this.inventory, this.worldObj, par1, par2, par3); this.openContainer.windowId = this.currentWindowId; this.openContainer.addCraftingToCrafters(this); } public void displayGUIEnchantment(int par1, int par2, int par3, String par4Str) { this.incrementWindowID(); this.playerNetServerHandler.sendPacketToPlayer(new Packet100OpenWindow(this.currentWindowId, 4, par4Str == null ? "" : par4Str, 9, par4Str != null)); this.openContainer = new ContainerEnchantment(this.inventory, this.worldObj, par1, par2, par3); this.openContainer.windowId = this.currentWindowId; this.openContainer.addCraftingToCrafters(this); } /** * Displays the GUI for interacting with an anvil. */ public void displayGUIAnvil(int par1, int par2, int par3) { this.incrementWindowID(); this.playerNetServerHandler.sendPacketToPlayer(new Packet100OpenWindow(this.currentWindowId, 8, "Repairing", 9, true)); this.openContainer = new ContainerRepair(this.inventory, this.worldObj, par1, par2, par3, this); this.openContainer.windowId = this.currentWindowId; this.openContainer.addCraftingToCrafters(this); } /** * Displays the GUI for interacting with a chest inventory. Args: chestInventory */ public void displayGUIChest(IInventory par1IInventory) { if (this.openContainer != this.inventoryContainer) { this.closeScreen(); } this.incrementWindowID(); this.playerNetServerHandler.sendPacketToPlayer(new Packet100OpenWindow(this.currentWindowId, 0, par1IInventory.getInvName(), par1IInventory.getSizeInventory(), par1IInventory.isInvNameLocalized())); this.openContainer = new ContainerChest(this.inventory, par1IInventory); this.openContainer.windowId = this.currentWindowId; this.openContainer.addCraftingToCrafters(this); } public void displayGUIHopper(TileEntityHopper par1TileEntityHopper) { this.incrementWindowID(); this.playerNetServerHandler.sendPacketToPlayer(new Packet100OpenWindow(this.currentWindowId, 9, par1TileEntityHopper.getInvName(), par1TileEntityHopper.getSizeInventory(), par1TileEntityHopper.isInvNameLocalized())); this.openContainer = new ContainerHopper(this.inventory, par1TileEntityHopper); this.openContainer.windowId = this.currentWindowId; this.openContainer.addCraftingToCrafters(this); } public void displayGUIHopperMinecart(EntityMinecartHopper par1EntityMinecartHopper) { this.incrementWindowID(); this.playerNetServerHandler.sendPacketToPlayer(new Packet100OpenWindow(this.currentWindowId, 9, par1EntityMinecartHopper.getInvName(), par1EntityMinecartHopper.getSizeInventory(), par1EntityMinecartHopper.isInvNameLocalized())); this.openContainer = new ContainerHopper(this.inventory, par1EntityMinecartHopper); this.openContainer.windowId = this.currentWindowId; this.openContainer.addCraftingToCrafters(this); } /** * Displays the furnace GUI for the passed in furnace entity. Args: tileEntityFurnace */ public void displayGUIFurnace(TileEntityFurnace par1TileEntityFurnace) { this.incrementWindowID(); this.playerNetServerHandler.sendPacketToPlayer(new Packet100OpenWindow(this.currentWindowId, 2, par1TileEntityFurnace.getInvName(), par1TileEntityFurnace.getSizeInventory(), par1TileEntityFurnace.isInvNameLocalized())); this.openContainer = new ContainerFurnace(this.inventory, par1TileEntityFurnace); this.openContainer.windowId = this.currentWindowId; this.openContainer.addCraftingToCrafters(this); } /** * Displays the dipsenser GUI for the passed in dispenser entity. Args: TileEntityDispenser */ public void displayGUIDispenser(TileEntityDispenser par1TileEntityDispenser) { this.incrementWindowID(); this.playerNetServerHandler.sendPacketToPlayer(new Packet100OpenWindow(this.currentWindowId, par1TileEntityDispenser instanceof TileEntityDropper ? 10 : 3, par1TileEntityDispenser.getInvName(), par1TileEntityDispenser.getSizeInventory(), par1TileEntityDispenser.isInvNameLocalized())); this.openContainer = new ContainerDispenser(this.inventory, par1TileEntityDispenser); this.openContainer.windowId = this.currentWindowId; this.openContainer.addCraftingToCrafters(this); } /** * Displays the GUI for interacting with a brewing stand. */ public void displayGUIBrewingStand(TileEntityBrewingStand par1TileEntityBrewingStand) { this.incrementWindowID(); this.playerNetServerHandler.sendPacketToPlayer(new Packet100OpenWindow(this.currentWindowId, 5, par1TileEntityBrewingStand.getInvName(), par1TileEntityBrewingStand.getSizeInventory(), par1TileEntityBrewingStand.isInvNameLocalized())); this.openContainer = new ContainerBrewingStand(this.inventory, par1TileEntityBrewingStand); this.openContainer.windowId = this.currentWindowId; this.openContainer.addCraftingToCrafters(this); } /** * Displays the GUI for interacting with a beacon. */ public void displayGUIBeacon(TileEntityBeacon par1TileEntityBeacon) { this.incrementWindowID(); this.playerNetServerHandler.sendPacketToPlayer(new Packet100OpenWindow(this.currentWindowId, 7, par1TileEntityBeacon.getInvName(), par1TileEntityBeacon.getSizeInventory(), par1TileEntityBeacon.isInvNameLocalized())); this.openContainer = new ContainerBeacon(this.inventory, par1TileEntityBeacon); this.openContainer.windowId = this.currentWindowId; this.openContainer.addCraftingToCrafters(this); } public void displayGUIMerchant(IMerchant par1IMerchant, String par2Str) { this.incrementWindowID(); this.openContainer = new ContainerMerchant(this.inventory, par1IMerchant, this.worldObj); this.openContainer.windowId = this.currentWindowId; this.openContainer.addCraftingToCrafters(this); InventoryMerchant inventorymerchant = ((ContainerMerchant)this.openContainer).getMerchantInventory(); this.playerNetServerHandler.sendPacketToPlayer(new Packet100OpenWindow(this.currentWindowId, 6, par2Str == null ? "" : par2Str, inventorymerchant.getSizeInventory(), par2Str != null)); MerchantRecipeList merchantrecipelist = par1IMerchant.getRecipes(this); if (merchantrecipelist != null) { try { ByteArrayOutputStream bytearrayoutputstream = new ByteArrayOutputStream(); DataOutputStream dataoutputstream = new DataOutputStream(bytearrayoutputstream); dataoutputstream.writeInt(this.currentWindowId); merchantrecipelist.writeRecipiesToStream(dataoutputstream); this.playerNetServerHandler.sendPacketToPlayer(new Packet250CustomPayload("MC|TrList", bytearrayoutputstream.toByteArray())); } catch (IOException ioexception) { ioexception.printStackTrace(); } } } /** * Sends the contents of an inventory slot to the client-side Container. This doesn't have to match the actual * contents of that slot. Args: Container, slot number, slot contents */ public void sendSlotContents(Container par1Container, int par2, ItemStack par3ItemStack) { if (!(par1Container.getSlot(par2) instanceof SlotCrafting)) { if (!this.playerInventoryBeingManipulated) { this.playerNetServerHandler.sendPacketToPlayer(new Packet103SetSlot(par1Container.windowId, par2, par3ItemStack)); } } } public void sendContainerToPlayer(Container par1Container) { this.sendContainerAndContentsToPlayer(par1Container, par1Container.getInventory()); } public void sendContainerAndContentsToPlayer(Container par1Container, List par2List) { this.playerNetServerHandler.sendPacketToPlayer(new Packet104WindowItems(par1Container.windowId, par2List)); this.playerNetServerHandler.sendPacketToPlayer(new Packet103SetSlot(-1, -1, this.inventory.getItemStack())); } /** * Sends two ints to the client-side Container. Used for furnace burning time, smelting progress, brewing progress, * and enchanting level. Normally the first int identifies which variable to update, and the second contains the new * value. Both are truncated to shorts in non-local SMP. */ public void sendProgressBarUpdate(Container par1Container, int par2, int par3) { this.playerNetServerHandler.sendPacketToPlayer(new Packet105UpdateProgressbar(par1Container.windowId, par2, par3)); } /** * sets current screen to null (used on escape buttons of GUIs) */ public void closeScreen() { this.playerNetServerHandler.sendPacketToPlayer(new Packet101CloseWindow(this.openContainer.windowId)); this.closeInventory(); } /** * updates item held by mouse */ public void updateHeldItem() { if (!this.playerInventoryBeingManipulated) { this.playerNetServerHandler.sendPacketToPlayer(new Packet103SetSlot(-1, -1, this.inventory.getItemStack())); } } public void closeInventory() { this.openContainer.onCraftGuiClosed(this); this.openContainer = this.inventoryContainer; } /** * Adds a value to a statistic field. */ public void addStat(StatBase par1StatBase, int par2) { if (par1StatBase != null) { if (!par1StatBase.isIndependent) { while (par2 > 100) { this.playerNetServerHandler.sendPacketToPlayer(new Packet200Statistic(par1StatBase.statId, 100)); par2 -= 100; } this.playerNetServerHandler.sendPacketToPlayer(new Packet200Statistic(par1StatBase.statId, par2)); } } } public void mountEntityAndWakeUp() { if (this.riddenByEntity != null) { this.riddenByEntity.mountEntity(this); } if (this.sleeping) { this.wakeUpPlayer(true, false, false); } } /** * this function is called when a players inventory is sent to him, lastHealth is updated on any dimension * transitions, then reset. */ public void setPlayerHealthUpdated() { this.lastHealth = -99999999; } /** * Add a chat message to the player */ public void addChatMessage(String par1Str) { StringTranslate stringtranslate = StringTranslate.getInstance(); String s1 = stringtranslate.translateKey(par1Str); this.playerNetServerHandler.sendPacketToPlayer(new Packet3Chat(s1)); } /** * Used for when item use count runs out, ie: eating completed */ protected void onItemUseFinish() { this.playerNetServerHandler.sendPacketToPlayer(new Packet38EntityStatus(this.entityId, (byte)9)); super.onItemUseFinish(); } /** * sets the itemInUse when the use item button is clicked. Args: itemstack, int maxItemUseDuration */ public void setItemInUse(ItemStack par1ItemStack, int par2) { super.setItemInUse(par1ItemStack, par2); if (par1ItemStack != null && par1ItemStack.getItem() != null && par1ItemStack.getItem().getItemUseAction(par1ItemStack) == EnumAction.eat) { this.getServerForPlayer().getEntityTracker().sendPacketToAllAssociatedPlayers(this, new Packet18Animation(this, 5)); } } /** * Copies the values from the given player into this player if boolean par2 is true. Always clones Ender Chest * Inventory. */ public void clonePlayer(EntityPlayer par1EntityPlayer, boolean par2) { super.clonePlayer(par1EntityPlayer, par2); this.lastExperience = -1; this.lastHealth = -1; this.lastFoodLevel = -1; this.destroyedItemsNetCache.addAll(((EntityPlayerMP)par1EntityPlayer).destroyedItemsNetCache); } protected void onNewPotionEffect(PotionEffect par1PotionEffect) { super.onNewPotionEffect(par1PotionEffect); this.playerNetServerHandler.sendPacketToPlayer(new Packet41EntityEffect(this.entityId, par1PotionEffect)); } protected void onChangedPotionEffect(PotionEffect par1PotionEffect) { super.onChangedPotionEffect(par1PotionEffect); this.playerNetServerHandler.sendPacketToPlayer(new Packet41EntityEffect(this.entityId, par1PotionEffect)); } protected void onFinishedPotionEffect(PotionEffect par1PotionEffect) { super.onFinishedPotionEffect(par1PotionEffect); this.playerNetServerHandler.sendPacketToPlayer(new Packet42RemoveEntityEffect(this.entityId, par1PotionEffect)); } /** * Move the entity to the coordinates informed, but keep yaw/pitch values. */ public void setPositionAndUpdate(double par1, double par3, double par5) { this.playerNetServerHandler.setPlayerLocation(par1, par3, par5, this.rotationYaw, this.rotationPitch); } /** * Called when the player performs a critical hit on the Entity. Args: entity that was hit critically */ public void onCriticalHit(Entity par1Entity) { this.getServerForPlayer().getEntityTracker().sendPacketToAllAssociatedPlayers(this, new Packet18Animation(par1Entity, 6)); } public void onEnchantmentCritical(Entity par1Entity) { this.getServerForPlayer().getEntityTracker().sendPacketToAllAssociatedPlayers(this, new Packet18Animation(par1Entity, 7)); } /** * Sends the player's abilities to the server (if there is one). */ public void sendPlayerAbilities() { if (this.playerNetServerHandler != null) { this.playerNetServerHandler.sendPacketToPlayer(new Packet202PlayerAbilities(this.capabilities)); } } public WorldServer getServerForPlayer() { return (WorldServer)this.worldObj; } /** * Sets the player's game mode and sends it to them. */ public void setGameType(EnumGameType par1EnumGameType) { this.theItemInWorldManager.setGameType(par1EnumGameType); this.playerNetServerHandler.sendPacketToPlayer(new Packet70GameEvent(3, par1EnumGameType.getID())); } public void sendChatToPlayer(String par1Str) { this.playerNetServerHandler.sendPacketToPlayer(new Packet3Chat(par1Str)); } /** * Returns true if the command sender is allowed to use the given command. */ public boolean canCommandSenderUseCommand(int par1, String par2Str) { return "seed".equals(par2Str) && !this.mcServer.isDedicatedServer() ? true : (!"tell".equals(par2Str) && !"help".equals(par2Str) && !"me".equals(par2Str) ? this.mcServer.getConfigurationManager().areCommandsAllowed(this.username) : true); } /** * Gets the player's IP address. Used in /banip. */ public String getPlayerIP() { String s = this.playerNetServerHandler.netManager.getSocketAddress().toString(); s = s.substring(s.indexOf("/") + 1); s = s.substring(0, s.indexOf(":")); return s; } public void updateClientInfo(Packet204ClientInfo par1Packet204ClientInfo) { if (this.translator.getLanguageList().containsKey(par1Packet204ClientInfo.getLanguage())) { this.translator.setLanguage(par1Packet204ClientInfo.getLanguage(), false); } int i = 256 >> par1Packet204ClientInfo.getRenderDistance(); if (i > 3 && i < 15) { this.renderDistance = i; } this.chatVisibility = par1Packet204ClientInfo.getChatVisibility(); this.chatColours = par1Packet204ClientInfo.getChatColours(); if (this.mcServer.isSinglePlayer() && this.mcServer.getServerOwner().equals(this.username)) { this.mcServer.setDifficultyForAllWorlds(par1Packet204ClientInfo.getDifficulty()); } this.setHideCape(1, !par1Packet204ClientInfo.getShowCape()); } public StringTranslate getTranslator() { return this.translator; } public int getChatVisibility() { return this.chatVisibility; } /** * on recieving this message the client (if permission is given) will download the requested textures */ public void requestTexturePackLoad(String par1Str, int par2) { String s1 = par1Str + "\u0000" + par2; this.playerNetServerHandler.sendPacketToPlayer(new Packet250CustomPayload("MC|TPack", s1.getBytes())); } /** * Return the position for this command sender. */ public ChunkCoordinates getPlayerCoordinates() { return new ChunkCoordinates(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.posY + 0.5D), MathHelper.floor_double(this.posZ)); } }