ForgeGradle Configurations
ForgeGradle has numerous configurations that can change how the development environment is configured. Most configurations are set using the minecraft
block; however, some others can be specified within the dependencies
block or modify the built jar
, such as reobfJar
.
Enabling Access Transformers
Access Transformers can widen the visibility or modify the final
flag of Minecraft classes, methods, and fields.
- Latest
- 7.0.40 and older
To enable Access Transformers in the production environment, you can set accessTransformers
to the configuration file in question:
minecraft {
// ...
// Add an Access Transformer file relative to the project's directory
accessTransformers {
file('src/main/resources/META-INF/accesstransformer.cfg')
// Multiple files can be specified and are applied in order
file('src/main/resources/accesstransformer_extras.cfg')
}
}
In production, NeoForge will search for Access Transformer files as specified in mods.toml
, or at META-INF/accesstransformer.cfg
if none are specified:
[[accessTransformers]]
file="META-INF/accesstransformer.cfg"
[[accessTransformers]]
file="accesstransformer_extras.cfg"
To enable Access Transformers in the production environment, you can set accessTransformer
to the configuration file in question:
minecraft {
// ...
// Add an access transformer file relative to the project's directory
accessTransformer = project.file('src/main/resources/META-INF/accesstransformer.cfg')
}
While the Access Transformer in the development environment can be read from anywhere the user specifies, in production, the file will only be read from META-INF/accesstransformer.cfg
.
Human-Readable Mappings
Minecraft's source code is obfuscated. As such, all classes, methods, and fields have machine-generated names with no package structures. Function-local variable names, meanwhile, are turned into a snowman (☃
) due to how the Local Variable Table is stored. It is difficult to create mods using obfuscated names as reverse engineering them is tedious, may change between versions, and may be invalid in the language itself but not in the bytecode.
To address the last two issues, NeoForge fuzzily maps each class, method, field, and parameter to a unique identifier, known as the SRG name, via the ForgeAutoRenamingTool. SRG mappings are used in production when the game is being run by the user client.
To allow easier development, ForgeGradle allows the user to choose a mapping set to apply on top of SRG mappings, which we will refer to as human-readable mappings. ForgeGradle knows how to convert the mod jar to SRG mappings for use in production via the reobf*
task.
The mapping set used can be specified by setting the mappings
field in the minecraft
block. The mappings
field takes in two arguments: channel
which is the type of the mapping set, and version
which is the version of the mapping set to apply.
Currently, there are three default mapping sets built into ForgeGradle:
official
- This uses the mapping set provided by Mojang. These mappings do not have parameter names and only exist from 1.14 onward.stable
- This uses a mapping set generated by MCP. These are typically incomplete and no longer exist as of 1.17.snapshot
- This also is a mapping set generated by MCP, similar to a nightly build of a program. These are also typically incomplete and no longer exist as of 1.17.
The class names used in production are from stable
prior to 1.17 and from official
from 1.17 onwards.
mappings {
// Sets the mappings to use those from Mojang for Minecraft 1.19.4.
mappings channel: 'official', version: '1.19.4'
// ...
}
Parchment
Parchment is an official project maintained by ParchmentMC which provides open, community-sourced parameter names and javadocs on top of the official
mapping set. You can learn how setup and use the parchment mapping set on their website.
Preparing Run Tasks
Run tasks (run*
) have two separate pipelines depending on whether they are executed through gradlew
or a run configuration. By default, there are two tasks that prepare the workspace for execution:
First, there are prepare*
tasks which are executed before run*
tasks and ensure that mapping files are prepared for the game. The prepare*Compile
task is typically only executed as a dependency of run*
tasks to make sure that the game is compiled before it is run.
If your IDE is either Eclipse or IntelliJ IDEA, the run configuration can be configured to execute the prepare*
tasks before starting the game by setting enableEclipsePrepareRuns
or enableIdeaPrepareRuns
, respectively, to true
. This will allow you to invoke custom Gradle tasks before your IDE launches the game.
minecraft {
// ...
// Enable the 'prepare*' task for run configurations
enableEclipsePrepareRuns true
enableIdeaPrepareRuns true
}
Copy IDE Resources
The copyIdeResources
property can be used to copy resources configured by the processResources
task to the IDE's resource output directories. This allows IDE run configurations that do not invoke Gradle (IntelliJ configured to use the IDEA runner or Eclipse) to use buildscript configurable resources. Usually, you need to enable this property when you are replacing values in files like the mods.toml
.
This only applies to Eclipse and IntelliJ IDEA via the copyEclipseResources
and copyIntellijResources
tasks, respectively.
minecraft {
// ...
// Copies the files from 'processResources' to the IDE's resource output directories
copyIdeResources true
}
Run Configuration Folders
Run configurations can be sorted into folders if the generateRunFolders
is set to true
. This reads the folderName
property set in the specific run configuration to determine the organizational structure.
minecraft {
// ...
// When true, run configurations will be grouped into folders by their 'folderName'
generateRunFolders true
}