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
_images/icon20.png

The infamous file & gear#

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#

See also

See this page for the ID to name conversions
See this page for the 1.13 block & item changes

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#

See also

See this page for the 1.13 biome changes

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 also

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.