@Override public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { // We invoke PlayerControllerMP.onPlayerRightClick() from here so that Minecraft // will invoke onItemUseFirst() on the client side. We'll tell it to pass the // request to the server, which will make sure that rift-related changes are // reflected on the server. if (!world.isRemote) { return stack; } MovingObjectPosition hit = this.getMovingObjectPositionFromPlayer(world, player, true); if (hit != null) { int hx = hit.blockX; int hy = hit.blockY; int hz = hit.blockZ; NewDimData dimension = PocketManager.createDimensionData(world); DimLink link = dimension.getLink(hx, hy, hz); if (world.getBlock(hx, hy, hz) == mod_pocketDim.blockRift && link != null && player.canPlayerEdit(hx, hy, hz, hit.sideHit, stack)) { // Invoke onPlayerRightClick() FMLClientHandler.instance() .getClient() .playerController .onPlayerRightClick(player, world, stack, hx, hy, hz, hit.sideHit, hit.hitVec); } } return stack; }
@Override public void placeLink(World world, int x, int y, int z) { if (!world.isRemote && world.getBlockId(x, y - 1, z) == this.blockID) { NewDimData dimension = PocketManager.createDimensionData(world); DimLink link = dimension.getLink(x, y, z); if (link == null) { dimension.createLink(x, y, z, LinkType.POCKET, world.getBlockMetadata(x, y - 1, z)); } } }
@Override public boolean onItemUseFirst( ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ) { // We want to use onItemUseFirst() here so that this code will run on the server side, // so we don't need the client to send link-related updates to the server. Still, // check whether we have a rift in sight before passing the request over. // On integrated servers, the link won't be removed immediately because of the rift // removal animation. That means we'll have a chance to check for the link before // it's deleted. Otherwise the Rift Remover's durability wouldn't drop. MovingObjectPosition hit = this.getMovingObjectPositionFromPlayer(world, player, true); if (hit != null) { x = hit.blockX; y = hit.blockY; z = hit.blockZ; NewDimData dimension = PocketManager.createDimensionData(world); DimLink link = dimension.getLink(x, y, z); if (world.getBlock(x, y, z) == mod_pocketDim.blockRift && link != null && player.canPlayerEdit(x, y, z, side, stack)) { // Tell the rift's tile entity to do its removal animation TileEntity tileEntity = world.getTileEntity(x, y, z); if (tileEntity != null && tileEntity instanceof TileEntityRift) { ((TileEntityRift) tileEntity).shouldClose = true; tileEntity.markDirty(); } else if (!world.isRemote) { // Only set the block to air on the server side so that we don't // tell the server to remove the rift block before it can use the // Rift Remover. Otherwise, it won't know to reduce durability. world.setBlockToAir(x, y, z); } if (world.isRemote) { // Tell the server about this return false; } else { if (!player.capabilities.isCreativeMode) { stack.damageItem(1, player); } player.worldObj.playSoundAtEntity(player, mod_pocketDim.modid + ":riftClose", 0.8f, 1); } } } return true; }