Mod Packages
Gothic 1 Remake can load custom content from Mod Packages placed under G1R/Mods or via the Steam Workshop.
A Mod Package may contain:
- MODDesc: JSON file describing and configuring the mod
- Config: .ini files
- Content: Cooked Assets, Blueprints, Levels
- Script: New .as scripts
- ScriptPatches: Patches applied to the base games script files
- Story: Localization, Audio
These packages are loaded and injected into Unreal’s Plugin-system early during engine init.
Example Mod Package file structure
Section titled “Example Mod Package file structure”Config/ Game.ini Engine.iniContent/ Assets1.pak Assets2.pakScript/ MyMod/ Weapons.as NPCs.as Quests.asScriptPatches/ Changes.patch
GothicMod.jsonEach ModPackage must have a GothicMod.json descriptor file at root level which contains the following contents:
{ "name": "InternalModName", "title": "User Facing Fancy Mod Name", "author": "Your Name", "description": "User facing description text", "projectWebsiteURL": "https://example.com/", "modVersion": "0.0.1",
// (optional) dependencies: This mod will only work, if you have these other mods installed "dependencies": [ { "name": "G1R", "requiredVersion": "1.0.5a", }, { "name": "OtherMod1", "requiredVersion": ">=1.0", }, { "name": "OtherMod2", "requiredVersion": ">=1.0, <2.0", }, ],
// (optional) loadOrder: Defines in which order mod packages should be loaded. // Possible values: // - first // - early // - normal // - late // - last "loadOrder": "normal",}Dependency versioning
Section titled “Dependency versioning”If your mod requires a certain game version or other mods to be present, you can use these version constraint patterns:
"1.0.5" exactly 1.0.5">=1.0" at least 1.0"<2.0" anything before 2.0">=1.0 <2.0" between 1.0 (inclusive) and 2.0 (exclusive)"!=1.0.5a" anything but 1.0.5a"*" or "" any versionClauses are separated by spaces and/or commas and all of them have to hold. Supported operators are >=, <=, ==, =, !=, > and <. A clause without an operator means “==”.
Enabling a mod package via commandline
Section titled “Enabling a mod package via commandline”During development, it can be useful to always enable specific mod packages via commandline:
G1R-Win64-Shipping.exe -Mods="Mod1,Mod2,Mod3"The mods enabled like this will only be active for this session.
Enabling a mod that is in some external folder
Section titled “Enabling a mod that is in some external folder”You can override the path that Gothic 1 Remake uses to search for mods. By default, it checks G1R/Mods/ and the SteamWorkshop (if available). Pass the following commandline
to point it at e.g. your development repository:
G1R-Win64-Shipping.exe -ModsDirectory="C:/Code/G1R-ModKit/Examples" -Mods="Example-HelloWorld"Example: Hello world
Section titled “Example: Hello world”Find your games installation folder. Inside, you will find these files and folders:
Engine/G1R/G1R-Win64-Shipping.exeCreate the following new folders (if they don’t exist already)
G1R/ModsG1R/Mods/HelloWorldinside the newly created G1R/Mods/HelloWorld, create a new textfile named GothicMod.json with the following content:
{ "name": "HelloWorld", "title": "Hello World - My first mod!", "author": "John Gothic", "description": "Very first mod", "modVersion": "0.0.1"}Then, create another folder:
G1R/Mods/HelloWorld/Scriptand create a new textfile DiegoExtension.as inside, with the following content:
class UChoiceDiego_HelloWorld : G1R::Conversation::UTopic_Hero__OC_STT_DIEGO{ default Caption = FText::FromString("Hello Diego!");
UFUNCTION(BlueprintOverride) void Act() { Hero.AI.Say(FText::FromString("Hello Diego!")); Diego.AI.Say(FText::FromString("Hello World!")); Diego.AI.GiveItemTo(Hero, UItMi_Orenugget, 999); }}You should now have the following files:
G1R/Mods/HelloWorld/GothicMod.jsonG1R/Mods/HelloWorld/Script/DiegoExtension.asLaunch Gothic 1 Remake with the following commandline flag:
-Mods=HelloWorldStart a new game, notice how Diego has a generous new dialogue option.
