Jump to content

Recommended Posts

In PoE, it was possible to make mods using the Asset Bundle Extractor and Notepad, but PoE2's files don't follow the same structure and I'm not sure what to do. There have been multiple mods made for PoE2 already and I was wondering if anyone had any secrets to share on what programs or techniques to use to get things unpacked/decompressed for editing.

  • Like 1
Link to comment
Share on other sites

Inside PoE 2 install dir > PoE2_data > exported > design

The folders there all have files that are titled 'something.bundle' and when you edit those files the changes take effect in-game; specifically everything inside GAMEDATA folder. Inside the GAMEDATA folder you will find all the unpacked files that relate to item stats, char stats, item properties, class properties, etc, etc.

  • Like 3
Link to comment
Share on other sites

If you go to Install Dir > PoE2_data > exported > localized > EN >TEXT

There you will find the text strings for conversations and quests and other writings in the game. For example if you wanted to change item lore, you can find those strings inside itemstrings.bundle file in that TEXT folder.

  • Like 2
Link to comment
Share on other sites

Hi Guys,

Maybe its stupid question but how do I open those .gamedatabundle files?

I tried AssetBundleExtractor but it won't work.

Thanks

They're just .json files. You can use any non-formatted text editor on them (such as Notepad). I personally recommend Sublime Text Editor.

  • Like 1
Link to comment
Share on other sites

Thanks, that worked.

But I still don't see how to, for example, change talent from "per rest" to "per encounter"

In Pillars of Eternity I just opened talent with Extractor, exported required MonoScript, change values, imported back and that's it.

In Deadfire I cannot see those files. Perhaps they compressed in Assetbundles folder?

Link to comment
Share on other sites

@londo

 

Modding these types of small changes in Deadfire is very easy. Here is a set of instructions for this specific example you asked about (Changing a class skill from Per Rest to Per Encounter).

 

1. Navigate to your "(User Drive Installation Directory)/steam/steamapps/common/Pillars of Eternity II/PillarsOfEternityII_Data/exported/design/gamedata/" directory.

 

2. Open the "abilities.gamedatabundle" file.

 

Note: This is a JSON format file, it just has a different file extension. Any text editor should be able to open this file. I recommend using Notepad++ as it has features which make locating specific values and formatting easier.

 

Note: If for some reason you see an unformatted single line of code, I recommend installing the JSON Viewer Notepad++ Extension as it has an auto-formatting feature for JSON files. It can be found on the projects github repository here: https://github.com/kapilratnani/JSON-Viewer or via the Notepad++ plugin manager list if you have that installed already.

 

3. For this example, we will modify the "Gaun's Pledge" ability to be a per encounter ability instead of per rest ability. I chose this because there are not many straight "per rest" abilities in POE II except for items and a few other things. This one is also available extremely early so you should be able to test easily.

 

4. With the "abilities.gamedatabundle" file open and notepad++ window active, press ctrl+f key to open the find dialogue box. Type in or copy paste the keywords of the ability you are looking for here, in this case, it would be "Gauns_Pledge". Hit the find button. You should arrive at a highlighted line that says: "DebugName": "LAX00_Gauns_Pledge_Ability", this is typically the name referenced in the POE II console and debugger.

 

5. Scroll down from there several lines until you find the line: "UsageType": "PerRest".

 

Note: All entries have this component so it is imperative that you locate the line that is within the brackets for the same entry in which the DebugName line resides. If you are unsure what I mean by this please refer to the following code section below in the spoiler tags.

 

 

 

	{
		"$type": "Game.GameData.GenericAbilityGameData, Assembly-CSharp",
		"DebugName": "LAX00_Gauns_Pledge_Ability",
		"ID": "12299971-513f-4708-933a-86e52c26afed",
		"Components": [{
			"$type": "Game.GameData.GenericAbilityComponent, Assembly-CSharp",
			"KeywordsIDs": ["d5e4e9b4-9565-4654-9e2e-2d68d8847c20"],
			"DisplayName": 4699,
			"Description": 462,
			"UpgradeDescriptions": [],
			"UpgradedFromID": "00000000-0000-0000-0000-000000000000",
			"Vocalization": "GenericSpellCast2",
			"Icon": "gui/icons/abilities/priest/restore_light_stamina.png",
			"UsageType": "PerRest",
			"UsageValue": 2,
			"AbilityClass": "None",
			"AbilityLevel": 1,
			"IsPassive": "false",
			"TriggerOnHit": "false",
			"IsModal": "false",
			"ModalGroupID": "00000000-0000-0000-0000-000000000000",
			"IsCombatOnly": "true",
			"IsNonCombatOnly": "false",
			"HideFromUI": "false",
			"HideFromCombatLog": "false",
			"UniqueSet": "None",
			"NoiseLevelID": "82bc1ce9-3a81-41ca-a61a-cc1f73a53de7",
			"DurationOverride": 0,
			"ClearsOnMovement": "false",
			"CannotActivateWhileInStealth": "false",
			"CannotActivateWhileInvisible": "false",
			"ActivationPrerequisites": {
				"Conditional": {
					"Operator": 0,
					"Components": []
				}
			},
			"ApplicationPrerequisites": {
				"Conditional": {
					"Operator": 0,
					"Components": []
				}
			},
			"DeactivationPrerequisites": {
				"Conditional": {
					"Operator": 0,
					"Components": []
				}
			},
			"PowerLevelScaling": {
				"BaseLevel": 0,
				"LevelIncrement": 1,
				"MaxLevel": 0,
				"DamageAdjustment": 1,
				"DurationAdjustment": 1,
				"BounceCountAdjustment": 0,
				"ProjectileCountAdjustment": 0,
				"AccuracyAdjustment": 0,
				"PenetrationAdjustment": 0
			},
			"StatusEffectKeywordsIDs": [],
			"StatusEffectsIDs": [],
			"VisualEffects": [],
			"SelfMaterialReplacementID": "00000000-0000-0000-0000-000000000000",
			"AttackID": "2dc03722-07e8-4e4d-a32c-20b676b61bba",
			"AITargetingConditional": {
				"Conditional": {
					"Operator": 0,
					"Components": []
				},
				"Scripts": []
			},
			"AudioEventListID": "f58e77ec-5b27-4840-864e-9246534ea28a"
		},
		{
			"$type": "Game.GameData.ProgressionUnlockableComponent, Assembly-CSharp"
		}]
	}

 

6. Change the "PerRest" value in the "UsageType" component entry to say "PerEncounter".

 

7. Create a new file in NotePad++ (do not save it until step 10). Now Copy/Paste the entire section starting with the '{' curly bracket above the line in the same section that says: "$type", and ending with the '}' curly bracket below the section:

 

{
"$type": "Game.GameData.ProgressionUnlockableComponent, Assembly-CSharp"
}]

Note: Do not copy the comma after the bracket. You only need commas between entries if you are making changes to more than one in the same file/block.

 

Finally, scroll to the top of the original file you were copying from, and copy the very top section of code that looks like this:

 

{
"GameDataObjects": [

Paste it directly before the block you copied into your new file already. Scroll to the end of your new file, and after the closing '}' curly bracket make sure to put a ']' closing square bracket. Hit enter to make one last line on the file and type another '}' closing curly bracket.

 

8. Minimize Notepad++, then find a location you are comfortable saving your mod data.

 

Note: This is important to make a file structure to override the default game data without actually overwriting the original. Overwriting the original data is not advisable and could cause data corruption or other problems.

 

9. Create a new folder wherever you chose before and name it "override". Inside this folder make another folder, it can be named anything though it is best practice to name is something specific to your mod's name, edits, etc.... So for this example name the folder "BetterGaunsPledge". Open this folder, and create another new folder, name it "design", open that folder and create one last folder inside it called "gamedata".

 

Note: This folder structure must be exact so as to mimic the folder structure of the base game's data.

 

10. Unminimize NotePad++ and select File > SaveAs. Name your new mod file something appropriate, and save it inside of the "override/BetterGaunsPledge/design/gamedata/" folder. In this case, I chose to name it "BetterGaunsPledge.gamedatabundle".

 

11. Cut/Paste then entire override folder that you created to the "(User Drive Installation Directory)/steam/steamapps/common/Pillars of Eternity II/PillarsOfEternityII_Data/" directory.

 

12. You should now be finished, you can load the game and test any changes made in the mod.

 

Note: Another quick related thing you can do to abilities like this is change the "UsageValue" entry. This is the number of times you can use an ability before needing to recharge it. So for instance additionally changing it from 2 to 3  in this example, would give the Gaun's Pledge ring 3 charges "PerEncounter" instead of 2 charges "PerRest".

 

Note: In case this was all too confusing for anyone reading. The code below in the spoiler tags is exactly what you should end up with in your new file by the end of these steps. Included it for reference. I hope this mini-tutorial helps some people.

 

 

 

{
	"GameDataObjects": [{
		"$type": "Game.GameData.GenericAbilityGameData, Assembly-CSharp",
		"DebugName": "LAX00_Gauns_Pledge_Ability",
		"ID": "12299971-513f-4708-933a-86e52c26afed",
		"Components": [{
			"$type": "Game.GameData.GenericAbilityComponent, Assembly-CSharp",
			"KeywordsIDs": ["d5e4e9b4-9565-4654-9e2e-2d68d8847c20"],
			"DisplayName": 4699,
			"Description": 462,
			"UpgradeDescriptions": [],
			"UpgradedFromID": "00000000-0000-0000-0000-000000000000",
			"Vocalization": "GenericSpellCast2",
			"Icon": "gui/icons/abilities/priest/restore_light_stamina.png",
			"UsageType": "PerEncounter",
			"UsageValue": 2,
			"AbilityClass": "None",
			"AbilityLevel": 1,
			"IsPassive": "false",
			"TriggerOnHit": "false",
			"IsModal": "false",
			"ModalGroupID": "00000000-0000-0000-0000-000000000000",
			"IsCombatOnly": "true",
			"IsNonCombatOnly": "false",
			"HideFromUI": "false",
			"HideFromCombatLog": "false",
			"UniqueSet": "None",
			"NoiseLevelID": "82bc1ce9-3a81-41ca-a61a-cc1f73a53de7",
			"DurationOverride": 0,
			"ClearsOnMovement": "false",
			"CannotActivateWhileInStealth": "false",
			"CannotActivateWhileInvisible": "false",
			"ActivationPrerequisites": {
				"Conditional": {
					"Operator": 0,
					"Components": []
				}
			},
			"ApplicationPrerequisites": {
				"Conditional": {
					"Operator": 0,
					"Components": []
				}
			},
			"DeactivationPrerequisites": {
				"Conditional": {
					"Operator": 0,
					"Components": []
				}
			},
			"PowerLevelScaling": {
				"BaseLevel": 0,
				"LevelIncrement": 1,
				"MaxLevel": 0,
				"DamageAdjustment": 1,
				"DurationAdjustment": 1,
				"BounceCountAdjustment": 0,
				"ProjectileCountAdjustment": 0,
				"AccuracyAdjustment": 0,
				"PenetrationAdjustment": 0
			},
			"StatusEffectKeywordsIDs": [],
			"StatusEffectsIDs": [],
			"VisualEffects": [],
			"SelfMaterialReplacementID": "00000000-0000-0000-0000-000000000000",
			"AttackID": "2dc03722-07e8-4e4d-a32c-20b676b61bba",
			"AITargetingConditional": {
				"Conditional": {
					"Operator": 0,
					"Components": []
				},
				"Scripts": []
			},
			"AudioEventListID": "f58e77ec-5b27-4840-864e-9246534ea28a"
		},
		{
			"$type": "Game.GameData.ProgressionUnlockableComponent, Assembly-CSharp"
		}]
	}]
}

 

 

  • Like 3
Link to comment
Share on other sites

Long-term, you'd probably want to make an override rather than changing the files directly, but changing them does work to get started.

 

You'd have to find the entry for the talent you want, then change it to whatever you needed. In "abilities.gamedatabundle" you would have to find whatever ability you're looking for, and change the 'UsageType' from 'PerRest' to 'PerEncounter'.

  • Like 1
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...