package net.minecraft.server.management; import net.minecraft.block.Block; import net.minecraft.block.BlockChest; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; import net.minecraft.item.ItemSword; import net.minecraft.network.play.server.S23PacketBlockChange; import net.minecraft.network.play.server.S38PacketPlayerListItem; import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityChest; import net.minecraft.util.BlockPos; import net.minecraft.util.EnumFacing; import net.minecraft.world.ILockableContainer; import net.minecraft.world.World; import net.minecraft.world.WorldServer; import net.minecraft.world.WorldSettings; public class ItemInWorldManager { /** The world object that this object is connected to. */ public World theWorld; /** The EntityPlayerMP object that this object is connected to. */ public EntityPlayerMP thisPlayerMP; private WorldSettings.GameType gameType; /** True if the player is destroying a block */ private boolean isDestroyingBlock; private int initialDamage; private BlockPos field_180240_f; private int curblockDamage; /** * Set to true when the "finished destroying block" packet is received but the block wasn't fully damaged yet. The * block will not be destroyed while this is false. */ private boolean receivedFinishDiggingPacket; private BlockPos field_180241_i; private int initialBlockDamage; private int durabilityRemainingOnBlock; private static final String __OBFID = "CL_00001442"; public ItemInWorldManager(World worldIn) { this.gameType = WorldSettings.GameType.NOT_SET; this.field_180240_f = BlockPos.ORIGIN; this.field_180241_i = BlockPos.ORIGIN; this.durabilityRemainingOnBlock = -1; this.theWorld = worldIn; } public void setGameType(WorldSettings.GameType p_73076_1_) { this.gameType = p_73076_1_; p_73076_1_.configurePlayerCapabilities(this.thisPlayerMP.capabilities); this.thisPlayerMP.sendPlayerAbilities(); this.thisPlayerMP.mcServer.getConfigurationManager().sendPacketToAllPlayers(new S38PacketPlayerListItem(S38PacketPlayerListItem.Action.UPDATE_GAME_MODE, new EntityPlayerMP[] {this.thisPlayerMP})); } public WorldSettings.GameType getGameType() { return this.gameType; } public boolean func_180239_c() { return this.gameType.isSurvivalOrAdventure(); } /** * Get if we are in creative game mode. */ public boolean isCreative() { return this.gameType.isCreative(); } /** * if the gameType is currently NOT_SET then change it to par1 */ public void initializeGameType(WorldSettings.GameType p_73077_1_) { if (this.gameType == WorldSettings.GameType.NOT_SET) { this.gameType = p_73077_1_; } this.setGameType(this.gameType); } public void updateBlockRemoving() { ++this.curblockDamage; float var3; int var4; if (this.receivedFinishDiggingPacket) { int var1 = this.curblockDamage - this.initialBlockDamage; Block var2 = this.theWorld.getBlockState(this.field_180241_i).getBlock(); if (var2.getMaterial() == Material.air) { this.receivedFinishDiggingPacket = false; } else { var3 = var2.getPlayerRelativeBlockHardness(this.thisPlayerMP, this.thisPlayerMP.worldObj, this.field_180241_i) * (float)(var1 + 1); var4 = (int)(var3 * 10.0F); if (var4 != this.durabilityRemainingOnBlock) { this.theWorld.sendBlockBreakProgress(this.thisPlayerMP.getEntityId(), this.field_180241_i, var4); this.durabilityRemainingOnBlock = var4; } if (var3 >= 1.0F) { this.receivedFinishDiggingPacket = false; this.func_180237_b(this.field_180241_i); } } } else if (this.isDestroyingBlock) { Block var5 = this.theWorld.getBlockState(this.field_180240_f).getBlock(); if (var5.getMaterial() == Material.air) { this.theWorld.sendBlockBreakProgress(this.thisPlayerMP.getEntityId(), this.field_180240_f, -1); this.durabilityRemainingOnBlock = -1; this.isDestroyingBlock = false; } else { int var6 = this.curblockDamage - this.initialDamage; var3 = var5.getPlayerRelativeBlockHardness(this.thisPlayerMP, this.thisPlayerMP.worldObj, this.field_180241_i) * (float)(var6 + 1); var4 = (int)(var3 * 10.0F); if (var4 != this.durabilityRemainingOnBlock) { this.theWorld.sendBlockBreakProgress(this.thisPlayerMP.getEntityId(), this.field_180240_f, var4); this.durabilityRemainingOnBlock = var4; } } } } public void func_180784_a(BlockPos p_180784_1_, EnumFacing p_180784_2_) { if (this.isCreative()) { if (!this.theWorld.func_175719_a((EntityPlayer)null, p_180784_1_, p_180784_2_)) { this.func_180237_b(p_180784_1_); } } else { Block var3 = this.theWorld.getBlockState(p_180784_1_).getBlock(); if (this.gameType.isAdventure()) { if (this.gameType == WorldSettings.GameType.SPECTATOR) { return; } if (!this.thisPlayerMP.func_175142_cm()) { ItemStack var4 = this.thisPlayerMP.getCurrentEquippedItem(); if (var4 == null) { return; } if (!var4.canDestroy(var3)) { return; } } } this.theWorld.func_175719_a((EntityPlayer)null, p_180784_1_, p_180784_2_); this.initialDamage = this.curblockDamage; float var6 = 1.0F; if (var3.getMaterial() != Material.air) { var3.onBlockClicked(this.theWorld, p_180784_1_, this.thisPlayerMP); var6 = var3.getPlayerRelativeBlockHardness(this.thisPlayerMP, this.thisPlayerMP.worldObj, p_180784_1_); } if (var3.getMaterial() != Material.air && var6 >= 1.0F) { this.func_180237_b(p_180784_1_); } else { this.isDestroyingBlock = true; this.field_180240_f = p_180784_1_; int var5 = (int)(var6 * 10.0F); this.theWorld.sendBlockBreakProgress(this.thisPlayerMP.getEntityId(), p_180784_1_, var5); this.durabilityRemainingOnBlock = var5; } } } public void func_180785_a(BlockPos p_180785_1_) { if (p_180785_1_.equals(this.field_180240_f)) { int var2 = this.curblockDamage - this.initialDamage; Block var3 = this.theWorld.getBlockState(p_180785_1_).getBlock(); if (var3.getMaterial() != Material.air) { float var4 = var3.getPlayerRelativeBlockHardness(this.thisPlayerMP, this.thisPlayerMP.worldObj, p_180785_1_) * (float)(var2 + 1); if (var4 >= 0.7F) { this.isDestroyingBlock = false; this.theWorld.sendBlockBreakProgress(this.thisPlayerMP.getEntityId(), p_180785_1_, -1); this.func_180237_b(p_180785_1_); } else if (!this.receivedFinishDiggingPacket) { this.isDestroyingBlock = false; this.receivedFinishDiggingPacket = true; this.field_180241_i = p_180785_1_; this.initialBlockDamage = this.initialDamage; } } } } public void func_180238_e() { this.isDestroyingBlock = false; this.theWorld.sendBlockBreakProgress(this.thisPlayerMP.getEntityId(), this.field_180240_f, -1); } private boolean func_180235_c(BlockPos p_180235_1_) { IBlockState var2 = this.theWorld.getBlockState(p_180235_1_); var2.getBlock().onBlockHarvested(this.theWorld, p_180235_1_, var2, this.thisPlayerMP); boolean var3 = this.theWorld.setBlockToAir(p_180235_1_); if (var3) { var2.getBlock().onBlockDestroyedByPlayer(this.theWorld, p_180235_1_, var2); } return var3; } public boolean func_180237_b(BlockPos p_180237_1_) { if (this.gameType.isCreative() && this.thisPlayerMP.getHeldItem() != null && this.thisPlayerMP.getHeldItem().getItem() instanceof ItemSword) { return false; } else { IBlockState var2 = this.theWorld.getBlockState(p_180237_1_); TileEntity var3 = this.theWorld.getTileEntity(p_180237_1_); if (this.gameType.isAdventure()) { if (this.gameType == WorldSettings.GameType.SPECTATOR) { return false; } if (!this.thisPlayerMP.func_175142_cm()) { ItemStack var4 = this.thisPlayerMP.getCurrentEquippedItem(); if (var4 == null) { return false; } if (!var4.canDestroy(var2.getBlock())) { return false; } } } this.theWorld.playAuxSFXAtEntity(this.thisPlayerMP, 2001, p_180237_1_, Block.getStateId(var2)); boolean var7 = this.func_180235_c(p_180237_1_); if (this.isCreative()) { this.thisPlayerMP.playerNetServerHandler.sendPacket(new S23PacketBlockChange(this.theWorld, p_180237_1_)); } else { ItemStack var5 = this.thisPlayerMP.getCurrentEquippedItem(); boolean var6 = this.thisPlayerMP.canHarvestBlock(var2.getBlock()); if (var5 != null) { var5.onBlockDestroyed(this.theWorld, var2.getBlock(), p_180237_1_, this.thisPlayerMP); if (var5.stackSize == 0) { this.thisPlayerMP.destroyCurrentEquippedItem(); } } if (var7 && var6) { var2.getBlock().harvestBlock(this.theWorld, this.thisPlayerMP, p_180237_1_, var2, var3); } } return var7; } } /** * Attempts to right-click use an item by the given EntityPlayer in the given World */ public boolean tryUseItem(EntityPlayer p_73085_1_, World worldIn, ItemStack p_73085_3_) { if (this.gameType == WorldSettings.GameType.SPECTATOR) { return false; } else { int var4 = p_73085_3_.stackSize; int var5 = p_73085_3_.getMetadata(); ItemStack var6 = p_73085_3_.useItemRightClick(worldIn, p_73085_1_); if (var6 == p_73085_3_ && (var6 == null || var6.stackSize == var4 && var6.getMaxItemUseDuration() <= 0 && var6.getMetadata() == var5)) { return false; } else { p_73085_1_.inventory.mainInventory[p_73085_1_.inventory.currentItem] = var6; if (this.isCreative()) { var6.stackSize = var4; if (var6.isItemStackDamageable()) { var6.setItemDamage(var5); } } if (var6.stackSize == 0) { p_73085_1_.inventory.mainInventory[p_73085_1_.inventory.currentItem] = null; } if (!p_73085_1_.isUsingItem()) { ((EntityPlayerMP)p_73085_1_).sendContainerToPlayer(p_73085_1_.inventoryContainer); } return true; } } } public boolean func_180236_a(EntityPlayer p_180236_1_, World worldIn, ItemStack p_180236_3_, BlockPos p_180236_4_, EnumFacing p_180236_5_, float p_180236_6_, float p_180236_7_, float p_180236_8_) { if (this.gameType == WorldSettings.GameType.SPECTATOR) { TileEntity var13 = worldIn.getTileEntity(p_180236_4_); if (var13 instanceof ILockableContainer) { Block var14 = worldIn.getBlockState(p_180236_4_).getBlock(); ILockableContainer var15 = (ILockableContainer)var13; if (var15 instanceof TileEntityChest && var14 instanceof BlockChest) { var15 = ((BlockChest)var14).getLockableContainer(worldIn, p_180236_4_); } if (var15 != null) { p_180236_1_.displayGUIChest(var15); return true; } } else if (var13 instanceof IInventory) { p_180236_1_.displayGUIChest((IInventory)var13); return true; } return false; } else { if (!p_180236_1_.isSneaking() || p_180236_1_.getHeldItem() == null) { IBlockState var9 = worldIn.getBlockState(p_180236_4_); if (var9.getBlock().onBlockActivated(worldIn, p_180236_4_, var9, p_180236_1_, p_180236_5_, p_180236_6_, p_180236_7_, p_180236_8_)) { return true; } } if (p_180236_3_ == null) { return false; } else if (this.isCreative()) { int var12 = p_180236_3_.getMetadata(); int var10 = p_180236_3_.stackSize; boolean var11 = p_180236_3_.onItemUse(p_180236_1_, worldIn, p_180236_4_, p_180236_5_, p_180236_6_, p_180236_7_, p_180236_8_); p_180236_3_.setItemDamage(var12); p_180236_3_.stackSize = var10; return var11; } else { return p_180236_3_.onItemUse(p_180236_1_, worldIn, p_180236_4_, p_180236_5_, p_180236_6_, p_180236_7_, p_180236_8_); } } } /** * Sets the world instance. */ public void setWorld(WorldServer p_73080_1_) { this.theWorld = p_73080_1_; } }