# Properties Files#

Many OptiFine features use properties files to control how textures within the resource pack are used. Properties files are simple text files similar to the Windows INI format. Each line is a property, specified as name=value.

# Sample comment
property1=value
property2=some_other_value

# Blank lines are allowed
property3=yet_another_value


All property names are case-sensitive: renderpass is not the same as renderPass. The order of properties within the file does not matter. Many properties have default values and can be omitted, and in some cases the entire properties file is optional.

Certain types of objects are used within properties files by different OptiFine features. Rather than describe these common types separately in each feature section, they are summarized here instead.

## Paths#

Often, OptiFine requires specifying a path to an image file or some other resource within the resource pack. This is simply the path to the texture within the resource pack. The folder structure within a resource pack can get deeply nested, so OptiFine has some shortcuts to make things easier. Whenever OptiFine asks to provide a texture file, any of these options can be used to specify the path.

Always use forward slashes “/” to separate folders.

Caution

Regardless of operating system (Windows, Mac, *nix), do not use backslashes “\”, or the game will not properly recognize the path.

In general, try to organize textures with the properties files that go with them. Resulting paths will be shorter and easier to maintain when files are moved around.

Bare filenames with no slashes will refer to the file relative to assets/minecraft/optifine, ignoring sub-folders.

texture=texture.png


You can use ./ to denote the current directory, regardless of location. .. can be used to travel up a folder, into the parent directory.

texture=./texture.png
texture=../texture.png
texture=../../subfolder/texture.png


The tilde character ~ can be used to refer to assets/minecraft/optifine.

texture=~/texture.png
texture=~/subfolder/texture.png


An optional “namespace” prefix can be added. This example refers to exactly the same “creeper.png” file as above:

texture=minecraft:textures/entity/creeper/creeper.png


For textures used by other mods, the namespace will be something other than minecraft:

texture=MODID:subfolder/texture.png


This refers to assets/MODID/subfolder/texture.png, not to assets/minecraft/MODID/subfolder/texure.png.

In short,

Symbol

Resolves to

./

Relative to directory properties file is in

../

Relative to parent directory

~

/assets/minecraft/optifine/

namespace:

/assets/namespace/

## Block IDs#

Danger

Do not use 1.7- IDs in 1.13+ packs!

• Before 1.7, items can only be specified by ID.

• Since 1.7, items can also be specified by name.

• Since 1.13, items can only be specified by name, not ID.

The block IDs continue to exist within the game internally, but can no longer be specified in the configuration files as they are unstable. For example, Stone used to be ID 1, but is now named minecraft:stone.

As with textures, the “minecraft:” prefix is optional, so just “stone” will also work, as “minecraft:” is the default.

In the event of mods, they will likely use a namespace other than minecraft:, so the prefix will be required for referring to modded items.

In 1.13, many variant blocks were “flattened” to several simple blocks, and the block metadata was removed from their ID.

The block name format is [namespace:]name[:property1=value1,...:property2=value1,...]. Optional parts are in angle brackets “[]”. Default namespace is “minecraft”.

blocks=oak_stairs

blocks=botania:crate
blocks=minecraft:oak_stairs

blocks=minecraft:oak_stairs:facing=east,west:half=bottom
blocks=oak_stairs:facing=east,west:half=bottom


The above will apply to oak stairs that are east or west facing, and are the bottom half. The “minecraft:” prefix is optional, so it can also be omitted.

## Biome IDs#

For features that call for a list of biomes, use this page. Biomes added by mods can also be used.

biomes=ocean deep_ocean river beach

biomes=minecraft:ocean biomesoplenty:highland


## Blending methods#

See Blend modes on Wikipedia for some illustrations

When two or more textures are combined, OptiFine offers several options for specifying the blending operation.

Valid blending methods are described below. “This” or “current” texture refers to the texture currently being applied. “Previous” refers to whatever has been rendered so far, which could be a single texture or the result of an earlier blending operation.

 replace Replace the previous layer entirely with the current bitmap. No blending and only simple on/off transparency. alpha Blend the two textures using this texture’s alpha value. This is the most common type of blending. overlay RGB value > 0.5 brightens the previous image, < 0.5 darkens. color is a synonym for this method. add Add this texture’s RGB values multiplied by alpha to the previous layer. subtract Subtract this texture’s RGB values from the previous layer. multiply Multiply the previous RGB values by this texture’s RGB values dodge Add this texture’s RGB values to the previous layer. burn New RGB = (1 - current RGB) * previous RGB screen New RGB = 1 - (1 - current RGB) * (1 - previous RGB)

## Numbers#

Occasionally, more than one number will need to be specified. OptiFine understands both ranges and simple lists.

Lists are defined with a space between each number. Each “entry” in the list can be either a single number or a range.

For example,

numbers=1 2 3 4 5 6
numbers=10 70 23 -6 210


Important

There is no range for less than or equal to, use a full range: 0-100, not -100 to match ≤100

Inclusive ranges between numbers are defined with a -. If there is no number present on the right side of the -, the range will match to infinity.

Ranges can be combined and intermixed with lists.

For example,

# 1, 2, 3
numbers=1-3

# Multiple ranges
# 1 through 3, or 6, or 8, or 10 through 15
# 1, 2, 3, 6, 8, 10, 11, 12, 13, 14, 15
numbers=1-3 6 8 10-15

# Greater than or equal to range
# 100, or 200, or 5340, or 25902, etc.
numbers=100-

# Negative number, not a range
# Only matches negative 100, not -4, -7, or -101
numbers=-100


## RGB colors#

Note

There is no support for HSL, CMYK, etc.

Color values are specified in hexadecimal RGB format:

# White
color=ffffff

# Black
color=000000

# Red
color=ff0000

# Green
color=00ff00

# Blue
color=0000ff


## NBT rules#

If multiple rules are provided, all of them must match. Currently, only these NBT types are supported:

• String, Integer, Short, Long, Double, Float: match exact value only

• Compound: Can match an exact tag or any tag (*)

• List: Can match an exact tag or any tag (*)

A value starting with ! negates the match (match all EXCEPT this).

• Match if Y is in list X: nbt.X.*=Y

• Match specific value: nbt.X=Y

• Match number in range: nbt.X=0-100

• Match if Y is first entry of list X: nbt.X.0=Y

• Match if X exists: nbt.X=!somevaluethatwillneverbetrue

Examples:

• Match item display name: nbt.display.Name=My Sword

• Match item display name with escapes: nbt.display.Name=\u00a74\u00a7oMy Sword

• Match item lore (first line only): nbt.display.Lore.0=My Lore Text

• Match item lore (any line): nbt.display.Lore.*=My Lore Text

## Regular expressions#

Important

Any backslashes must be doubled as well. Literal backslashes within a regular expression or wildcard must be quadrupled.
✅ Correct: nbt.display.name=regex:\\d+, nbt.display.name=regex:\\\\, nbt.display.name=/\\/\\
❌ Wrong: nbt.display.name=regex:\d+, nbt.display.name=regex:\\ (for matching \\), nbt.display.name=/\/\\ (missing a backslash)

Strings can be matched in several ways:

Pattern: Letter to Herobrine
✅ Matches the exact string Letter to Herobrine and nothing else.
Pattern: pattern
Example: pattern:?Letter to *
* matches any text
? matches any text regardless of if it exists
✅ Matches: Letter to Herobrine, Letter to a creeper, My letter to John
❌ Does not match: letter to Herobrine (case sensitivity), Letter from Herobrine (doesn’t match “to”)
Pattern: ipattern
Example: ipattern:Letter to *
✅ Matches: Letter to Herobrine, Letter to a creeper, letter to Herobrine, letter to STEVE
Pattern: regex
Example: regex:Letter (to|from) .*
✅ Matches: Letter to Herobrine, Letter from Herobrine
❌ Does not match: letter to Herobrine (letter case), A Letter to Herobrine (A is not in expression)
Uses Java regular expressions for syntax
Pattern: iregex
Example: iregex:Letter (to|from) .*
✅ Matches: Letter to Herobrine, Letter from Herobrine, letter to Herobrine, LETTER TO HEROBRINE
❌ Does not match: A Letter to Herobrine (A is not in expression), LETTER TOFROM HEROBRINE (TOFROM does not match either to, nor from; can’t match both)
Uses Java regular expressions for syntax

🆚️ This documentation assumes the latest OptiFine version. Notes are not made for legacy versions (1.8).
🔙️ This documentation is updated to commit 8410499f.
©️ This file is offered without any copyright restrictions. Please copy and modify it to suit your needs. Credit is optional, but appreciated.