Jump to content

Recommended Posts

I promised to throw a beginners guide to Modding up - this does almost nothing but is a valid Mod
 
This is the slimmest mod I could imagine
 
If you haven't got one create an override directory in "Pillars of Eternity II Deadfire\PillarsOfEternityII_Data" 
 
Create a new directory called first_mod
 
Now create a sub-sirectory called design and one below that called gamedata
 
In that directory create a file called first_mod.gamedatabundle (no .txt) and stick the following in it
{
    "GameDataObjects": [
 		{
            "$type": "Game.GameData.WeaponGameData, Assembly-CSharp",
            "DebugName": "Great_Sword",
            "ID": "3530e7a2-ec4f-4d5f-a436-53e26ed3e075",
            "Components": [
                {
                    "$type": "Game.GameData.ItemComponent, Assembly-CSharp",
                    "DisplayName": 11,
                    "DescriptionText": 262,
                    "FilterType": "Weapons",
                    "InventoryAudioEventListID": "d9ef8ec9-f1fb-4d0b-88b7-49d7c0310019",
                    "IsQuestItem": "false",
                    "IsIngredient": "false",
                    "IsCurrency": "false",
                    "IsAdventuringItem": "false",
                    "CanSellForFullValue": "false",
                    "MaxStackSize": 1,
                    "NeverDropAsLoot": "false",
                    "CanBePickpocketed": "true",
                    "IsUnique": "false",
                    "Value": 50,
                    "IconTextureSmall": "gui\/icons\/items\/weapons\/great_sword\/great_sword_s.png",
                    "IconTextureLarge": "gui\/icons\/items\/weapons\/great_sword\/great_sword_l.png",
                    "PencilSketchTexture": "",
                    "InspectOnUseButton": [],
                    "IsPlaceholder": "false"
                },
                {
                    "$type": "Game.GameData.EquippableComponent, Assembly-CSharp",
                    "EquipmentType": "GreatSword",
                    "EquipmentSlot": "BothPrimaryAndSecondary",
                    "AppearancePiece": {
                        "ModelVisualDataPath": "prefabs\/items\/appearance\/weapons\/great_sword\/great_sword01.asset"
                    },
                    "ItemModsIDs": [],
                    "OnEquipVisualEffects": [],
                    "RestrictedToClassIDs": [],
                    "RestrictedToPlayer": "false",
                    "ProficientAbilityID": "0b5fe616-3d6d-460d-a02d-28a1b4217796",
                    "CannotUnequip": "false",
                    "ItemRendererPrefab": "prefabs\/itemrenderers\/genericitemrenderer.prefab",
                    "ItemModel": "art\/character\/weapons\/great_sword\/great_sword01\/w_gs01.fbx",
                    "AnimationController": "",
                    "PaperdollOverrideRenderer": "",
                    "AttackSummonID": "00000000-0000-0000-0000-000000000000",
                    "CannotSheathe": "false",
                    "PropVisualEffects": []
                },
                {
                    "$type": "Game.GameData.WeaponComponent, Assembly-CSharp",
                    "Stance": "TwoHandedClosedGrip",
                    "AnimationStanceID": "2bfb014c-53e1-44d0-82c8-3c3ff7a6741e",
                    "StatusEffectsOnLaunchIDs": [],
                    "IsDisplayedWhenAlternate": "true",
                    "IsUniversalType": "false",
                    "AttackID": "1d10eee8-c68a-4593-8075-7a2e19db6602",
                    "NoiseLevelID": "15743f94-1026-40b0-8e13-a667b3f66f63",
                    "ForceBackScabbard": "true",
                    "ScabbardAppearancePiece": {
                        "ModelVisualDataPath": "prefabs\/items\/appearance\/weapons\/great_sword\/a_great_sword01_scabbard.asset"
                    },
                    "ScabbardRendererPrefab": "prefabs\/itemrenderers\/genericitemrenderer.prefab",
                    "ScabbardModel": "",
                    "AudioEventListID": "00000000-0000-0000-0000-000000000000"
                }
            ]
        }
	]
}
Everything in POE2 is identified using a GUID - all we've done so far is clone an existing item
 
Let's go get one...
 
 
For testing we'll use fe314613-c507-4f86-86d2-dd94b09429e0
 
Now, let's change the first couple of lines to look like this
 
            "DebugName": "First_Mod_Great_Sword",
            "ID": "fe314613-c507-4f86-86d2-dd94b09429e0",
We've now got our own Great Sword, let's go name it.
 
You see DisplayName and DescriptionText, lets change those...
 
Create first_mod\localized\en\text\game and a new file called items.stringtable
 
Stick the folowing in it...
 
<?xml version="1.0" encoding="utf-8"?>
<StringTableFile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Name>game\items</Name>
  <Entries>
    <Entry>
      <ID>12650</ID>
      <DefaultText>First Mod Great Sword</DefaultText>
      <FemaleText />
    </Entry>
    <Entry>
      <ID>12651</ID>
      <DefaultText>For Frodo!</DefaultText>
      <FemaleText />
    </Entry>
  </Entries>  
</StringTableFile>
Note the numbers - make then something weird so as not to clash > 10k is good but bear in mind another Mod authour may be using the same numbers (Mod Clash)
 
Change your gamebundle to reference the new strings
 
                    "DisplayName": 12650,
                    "DescriptionText": 12651,
Save your mod and start a game.
 
Now we're going to cheat ourselves in out new item - this is perfectly acceptable when Modding for quick tests
 
To get into the terminal hit the back-quote (`) character and type in iroll20s
Now let's get us our new sword...
Hit the back-quote (`) character and type in GiveItem fe314613-c507-4f86-86d2-dd94b09429e0
Hit the back-quote (`) character and type in iroll20s again to switch off Cheat mode
 
A zip of first_mod with far more utility folders is attached
 
All we've done so far is copy an item and make it our own - this is where the fun begins
 
Hopefully one of our Slack Team will continue this (I'm busy)
 
There in no mention of translations, changing the basic sword or whatever in this article
 
Artwork in the Zip is © Mark Millmore of https://discoveringegypt.com/ and used under license

 

first_mod.zip

  • Like 6

OK Fair warning has been applied

 

I'm gonna move the domain to https://perspak.com early Feb but will keep all content

 

There are reasons behind this move which basically boil down to unifying my release schedule

 

My friends are welcome to play (I'll set you up your own areas if you desire them)

 

Please note that this process is messy so may take a few weeks 

Link to comment
Share on other sites

I want to start with modding but now little bit afraid. How to investigate all possible values for each property ? How to navigate between GUID's ? 

Do you know if obsidian plans to release some open source tool to help developers ? Otherwise maybe community want to develop this tool ? I think this is not big problem to put all *.gamedatabundle to Elastic/(any db that natively support JSON) and create GUI with React or VUE 

Edited by mant2si
  • Like 1

Solo PotD builds: The Glanfathan Soul Hunter (Neutral seer. Dominate and manipulate your enemies), Harbinger of Doom (Dark shaman. Burn and sacrifice, yourself and enemies for Skaen sake)

Link to comment
Share on other sites

I want to start with modding but now little bit afraid. How to investigate all possible values for each property ? How to navigate between GUID's ? 

 

Do you know if obsidian plans to release some open source tool to help developers ? Otherwise maybe community want to develop this tool ? I think this is not big problem to put all *.gamedatabundle to Elastic/(any db that natively support JSON) and create GUI with React or VUE 

 

about values

 

https://eternity.obsidian.net/game-data-formats/concepts

Edited by kilay
Link to comment
Share on other sites

 

I want to start with modding but now little bit afraid. How to investigate all possible values for each property ? How to navigate between GUID's ? 

 

Do you know if obsidian plans to release some open source tool to help developers ? Otherwise maybe community want to develop this tool ? I think this is not big problem to put all *.gamedatabundle to Elastic/(any db that natively support JSON) and create GUI with React or VUE 

 

about values

 

https://eternity.obsidian.net/game-data-formats/concepts

 

Hmm, this is API ? But again for game developing I prefer GUI, simple because I don't like navigate by GUID with CTRL + F, I like autocomplition and live validation. So now there non exist any GUI tool ? 

 

Maybe something like starcraft 2 GalaxyEditor

Edited by mant2si

Solo PotD builds: The Glanfathan Soul Hunter (Neutral seer. Dominate and manipulate your enemies), Harbinger of Doom (Dark shaman. Burn and sacrifice, yourself and enemies for Skaen sake)

Link to comment
Share on other sites

 

 

I want to start with modding but now little bit afraid. How to investigate all possible values for each property ? How to navigate between GUID's ? 

 

Do you know if obsidian plans to release some open source tool to help developers ? Otherwise maybe community want to develop this tool ? I think this is not big problem to put all *.gamedatabundle to Elastic/(any db that natively support JSON) and create GUI with React or VUE 

 

about values

 

https://eternity.obsidian.net/game-data-formats/concepts

 

Hmm, this is API ? But again for game developing I prefer GUI, simple because I don't like navigate by GUID with CTRL + F, I like autocomplition and live validation. So now there non exist any GUI tool ? 

 

Maybe something like starcraft 2 GalaxyEditor

 

 

https://spiritualsuccessor.net

Edited by kilay
  • Like 1
Link to comment
Share on other sites

Hey, this was a VERY basic mod piece

 

@House2fly wanted a specific example - I gave him one

 

Expanding this is dead sample is super simple

 

Rats - I'm gonna expand it, ain't I - well it's only an hour or so to make first mod into uselful kit

 

Then I have to attatch it to a shop

OK Fair warning has been applied

 

I'm gonna move the domain to https://perspak.com early Feb but will keep all content

 

There are reasons behind this move which basically boil down to unifying my release schedule

 

My friends are welcome to play (I'll set you up your own areas if you desire them)

 

Please note that this process is messy so may take a few weeks 

Link to comment
Share on other sites

As this is now pinned

 

well -byee week off

 

I've gotta do one of these a day

 

I'll ask our Slack for some help (they're good)

OK Fair warning has been applied

 

I'm gonna move the domain to https://perspak.com early Feb but will keep all content

 

There are reasons behind this move which basically boil down to unifying my release schedule

 

My friends are welcome to play (I'll set you up your own areas if you desire them)

 

Please note that this process is messy so may take a few weeks 

Link to comment
Share on other sites

I'm stickied now (thanks @CDiaz)

 

I'll spend a few days taking first mod to - well, higher numbers

OK Fair warning has been applied

 

I'm gonna move the domain to https://perspak.com early Feb but will keep all content

 

There are reasons behind this move which basically boil down to unifying my release schedule

 

My friends are welcome to play (I'll set you up your own areas if you desire them)

 

Please note that this process is messy so may take a few weeks 

Link to comment
Share on other sites

Part 2

 

This one is code-light but experience heavy

OK - let's not rely on cheats. Let's go give it to a vendor.

There is a problem - well, two actually.

1) Other Modders are looking to add items to a vendor so we can get Mod Clash. If two Mods use the same vendor one wins the other loses. We have petitioned the Devs to let us convert any named NPC into a vendor, if/when we get this ability the issue becomes moot.

2) Savegames cache state. If you enter an area and talk to someone that information is saved. If you've already talked to your vendor we get the saved vendor list NOT our new version - there are ways around this but involves hacking your savegame (they're ZIPs if you want a clue)

 

Bearing in mind these to-be-resolved issues it is highly recommended to interact with NOBODY and make a bee-line for Port Maje then save before entering the town

 

This takes ages so I've prepared one for you (See attachments) - geez - I had to Zip a Zip...

 

Stick this in your Savegames directory - on Windows it'll be C:\Users\<you>\Saved Games\Pillars of Eternity II - got a Mac but someone can give us the path for that one

This character is a nothing rogue with no companions who decided to save the box (not really worth it) ignored everyone and is standing outside Port Maje (PM) - he's a good character as a base for Mod experimentation - he's called First Mod and has done everything wrong.

 

You're now in the perfect place to do some more advanced Mod development

 

Feel free to create your own Dev save - I'm simply circumventing the necessity or going thru the torturous StartGame and wasting 20 mins getting solo to PM.

 

OK - we are now standing directly outside PM and we've interacted with as few people as possible.

You can see the issues if you use this save, go talk to fishmonger THEN apply today's Mod, reload - no MOD stupid sword. Apply the Mod (we're almost there) and repeat this using the savegame - First Mod Great Sword is buyable!

Our experiments show that if you've talked to a vendor this is when the bug occurs. Without Mod installed go to fishmonger - save - chat, save. Install Mod and reload before and after.

 

We're simply trying to make your own Mod development less frustrating - took us days to work out the rules.

 

OK - let's vendor our crap sword

 

In items.gamedatabundle we can find...

 

            "DebugName": "Store_09_PM_Fishmonger",
            "ID": "101d4c38-674b-415d-bb1e-bd68846ef033",

We need to override her while keeping good JSON formatting

 

You'll find this....

        {
            "$type": "Game.GameData.LootListGameData, Assembly-CSharp",
            "DebugName": "Store_09_PM_Fishmonger_Rack",
            "ID": "a6696c7c-edaf-4996-be76-8978225b5930",
            "Components": [
                {
                    "$type": "Game.GameData.LootListComponent, Assembly-CSharp",
                    "Conditional": {
                        "Operator": 0,
                        "Components": []
                    },
                    "OutputChance": 1,
                    "OutputMode": "All",
                    "Items": [
                        {
                            "Conditional": {
                                "Operator": 0,
                                "Components": []
                            },
                            "OutputChance": 1,
                            "MinCount": 2,
                            "MaxCount": 3,
                            "Weight": 1,
                            "ItemID": "f2a6175c-1107-4920-9e2f-ae7d07e09167",
                            "LootListID": "00000000-0000-0000-0000-000000000000",
                            "LockedVisible": "false"
                        },
                        {
                            "Conditional": {
                                "Operator": 0,
                                "Components": []
                            },
                            "OutputChance": 1,
                            "MinCount": 3,
                            "MaxCount": 4,
                            "Weight": 1,
                            "ItemID": "859b1408-0d16-4e80-8dd6-0b35c42ee9ec",
                            "LootListID": "00000000-0000-0000-0000-000000000000",
                            "LockedVisible": "false"
                        }
                    ]
                }
            ]
        },

Note the comma at the end - lose it and we've now got a valid JSON object

Now let's add it to first_mod.gamedatabundle

As mentioned in Part 1 your mod gamedatabundle can include things in other official bundles

We're going to take the last item in Fishmonger's shop and add our rubbish sword - don't worry, we'll make it better next time. We thought you'd like to see the shop bit first.

OK - this is Part 1 with some added data for the shop

{
    "GameDataObjects": [
 		{
            "$type": "Game.GameData.WeaponGameData, Assembly-CSharp",
            "DebugName": "First_Mod_Great_Sword",
            "ID": "fe314613-c507-4f86-86d2-dd94b09429e0",
            "Components": [
                {
                    "$type": "Game.GameData.ItemComponent, Assembly-CSharp",
                    "DisplayName": 12650,
                    "DescriptionText": 12651,
                    "FilterType": "Weapons",
                    "InventoryAudioEventListID": "d9ef8ec9-f1fb-4d0b-88b7-49d7c0310019",
                    "IsQuestItem": "false",
                    "IsIngredient": "false",
                    "IsCurrency": "false",
                    "IsAdventuringItem": "false",
                    "CanSellForFullValue": "false",
                    "MaxStackSize": 1,
                    "NeverDropAsLoot": "false",
                    "CanBePickpocketed": "true",
                    "IsUnique": "false",
                    "Value": 50,
                    "IconTextureSmall": "gui\/icons\/items\/weapons\/great_sword\/great_sword_s.png",
                    "IconTextureLarge": "gui\/icons\/items\/weapons\/great_sword\/great_sword_l.png",
                    "PencilSketchTexture": "",
                    "InspectOnUseButton": [],
                    "IsPlaceholder": "false"
                },
                {
                    "$type": "Game.GameData.EquippableComponent, Assembly-CSharp",
                    "EquipmentType": "GreatSword",
                    "EquipmentSlot": "BothPrimaryAndSecondary",
                    "AppearancePiece": {
                        "ModelVisualDataPath": "prefabs\/items\/appearance\/weapons\/great_sword\/great_sword01.asset"
                    },
                    "ItemModsIDs": [],
                    "OnEquipVisualEffects": [],
                    "RestrictedToClassIDs": [],
                    "RestrictedToPlayer": "false",
                    "ProficientAbilityID": "0b5fe616-3d6d-460d-a02d-28a1b4217796",
                    "CannotUnequip": "false",
                    "ItemRendererPrefab": "prefabs\/itemrenderers\/genericitemrenderer.prefab",
                    "ItemModel": "art\/character\/weapons\/great_sword\/great_sword01\/w_gs01.fbx",
                    "AnimationController": "",
                    "PaperdollOverrideRenderer": "",
                    "AttackSummonID": "00000000-0000-0000-0000-000000000000",
                    "CannotSheathe": "false",
                    "PropVisualEffects": []
                },
                {
                    "$type": "Game.GameData.WeaponComponent, Assembly-CSharp",
                    "Stance": "TwoHandedClosedGrip",
                    "AnimationStanceID": "2bfb014c-53e1-44d0-82c8-3c3ff7a6741e",
                    "StatusEffectsOnLaunchIDs": [],
                    "IsDisplayedWhenAlternate": "true",
                    "IsUniversalType": "false",
                    "AttackID": "1d10eee8-c68a-4593-8075-7a2e19db6602",
                    "NoiseLevelID": "15743f94-1026-40b0-8e13-a667b3f66f63",
                    "ForceBackScabbard": "true",
                    "ScabbardAppearancePiece": {
                        "ModelVisualDataPath": "prefabs\/items\/appearance\/weapons\/great_sword\/a_great_sword01_scabbard.asset"
                    },
                    "ScabbardRendererPrefab": "prefabs\/itemrenderers\/genericitemrenderer.prefab",
                    "ScabbardModel": "",
                    "AudioEventListID": "00000000-0000-0000-0000-000000000000"
                }
            ]
        }, {
            "$type": "Game.GameData.LootListGameData, Assembly-CSharp",
            "DebugName": "Store_09_PM_Fishmonger",
            "ID": "101d4c38-674b-415d-bb1e-bd68846ef033",
            "Components": [
                {
                    "$type": "Game.GameData.LootListComponent, Assembly-CSharp",
                    "Conditional": {
                        "Operator": 0,
                        "Components": []
                    },
                    "OutputChance": 1,
                    "OutputMode": "All",
                    "Items": [
                        {
                            "Conditional": {
                                "Operator": 0,
                                "Components": []
                            },
                            "OutputChance": 1,
                            "MinCount": 3,
                            "MaxCount": 4,
                            "Weight": 1,
                            "ItemID": "c9b3ab6f-4eec-4cab-aab7-2fd8d9770c4d",
                            "LootListID": "00000000-0000-0000-0000-000000000000",
                            "LockedVisible": "false"
                        },
                        {
                            "Conditional": {
                                "Operator": 0,
                                "Components": []
                            },
                            "OutputChance": 1,
                            "MinCount": 6,
                            "MaxCount": 8,
                            "Weight": 1,
                            "ItemID": "e253a1c6-5e1c-409a-8666-e27243f3b703",
                            "LootListID": "00000000-0000-0000-0000-000000000000",
                            "LockedVisible": "false"
                        },
                        {
                            "Conditional": {
                                "Operator": 0,
                                "Components": []
                            },
                            "OutputChance": 1,
                            "MinCount": 1,
                            "MaxCount": 1,
                            "Weight": 1,
                            "ItemID": "fe314613-c507-4f86-86d2-dd94b09429e0",
                            "LootListID": "00000000-0000-0000-0000-000000000000",
                            "LockedVisible": "false"
                        }
                    ]
                }
            ]
        }
	]
}

All we've done is replicated an item and changed an ID to our junky sword's ID

Go see fishmonger in PM, she's near your eventual Ship

 

first_mod_001.png

 

Go to her shop and we get this...

 

first_mod_002.png

 

Attached is an updated version of first_mod.zip - just overwrite part one with this and you've got a shop

 

Next time we'll make crap sword into good sword

 

 

First Mod (DeadfireArchipelago) (ef1068b1-3411-4af6-98fb-3d5b3b06d652) (917052006).zip

first_mod.zip

  • Like 1

OK Fair warning has been applied

 

I'm gonna move the domain to https://perspak.com early Feb but will keep all content

 

There are reasons behind this move which basically boil down to unifying my release schedule

 

My friends are welcome to play (I'll set you up your own areas if you desire them)

 

Please note that this process is messy so may take a few weeks 

Link to comment
Share on other sites

Part 3

 

Integrating your Mod into POE2

 

A cool update in 1.2.0 was the inclusion of the Mod Manager

 

There is no code in this one - this is simplifying some complex issues raised by @BMac in his starting out post

If you look in the first_mod folder, assuming you've got installed you'll find two files - manifest.json and thumb.png

The thumb.png is a 149x82 image that will show up in Mod Manager.

We got ours under license (I have to say this every time) from Mark Millmore of https://discoveringegypt.com/

 

You replace that image with your own, if omitted you'll get a stock piccie

 

Let's get to personalising it

{
    "Title" : {
		"de" : "First Mod",
        "en" : "First Mod",
		"es" : "First Mod",
		"fr" : "First Mod",
		"it" : "First Mod",
		"pl" : "First Mod",
		"pt" : "First Mod",
		"ru" : "First Mod",
		"zh" : "First Mod"
    },
    "Description" : {
		"de" : "For Frodo",
        "en" : "For Frodo",
		"es" : "For Frodo",
		"fr" : "For Frodo",
		"it" : "For Frodo",
		"pl" : "For Frodo",
		"pt" : "For Frodo",
		"ru" : "For Frodo",
		"zh" : "For Frodo"
    },
    "Author" : "Peardox",
    "ModVersion": "1.2",
    "SupportedGameVersion" : {
        "Min" : "1.1.0",
        "Max" : "1.2.0"
    }
}

The Description and Title bits allow us to define localisation so go to Google Translate and grab basic translations (we'll be coming back to this point)

The next bits are pretty self-evident - I wrote it, I've given it version 1.2 (as I'm using 1.2.0 of the game)

The SupportedGameVersion is something we need to pay attention to

We've already tried setting Max to 1.3.0 but on August 3rd we get a V2 so this mod won't, most likely, be picked up

If you're doing nothing dangerous simply set Max to 99.0.0

 

OK - translations

Most of our co-dependant Slack Group (see my sig) don't speak English as their native language but have good English skills

We've got Russian, Italian, Polish and German covered which is fairly good (Obsidian are far worse)

 

I can go to our Slack and tomorrow have a (mostly) fully translated manifest.json

The next update will include these changes

 

Sometimes we have to go "outside the box", I personally know pro translators - I hate asking them so ask us for an invite 

PM me

 

Right - translation crew...

OK Fair warning has been applied

 

I'm gonna move the domain to https://perspak.com early Feb but will keep all content

 

There are reasons behind this move which basically boil down to unifying my release schedule

 

My friends are welcome to play (I'll set you up your own areas if you desire them)

 

Please note that this process is messy so may take a few weeks 

Link to comment
Share on other sites

I'm almost ready for the next part

If anyone can fix the translations before I write it....
 

{
    "Title" : {
"de" : "First Mod",
        "en" : "First Mod",
"es" : "First Mod",
"fr" : "First Mod",
"it" : "Prima Mod",
"pl" : "Pierwszy Mod",
"pt" : "First Mod",
"ru" : "First Mod",
"zh" : "First Mod"
    },
    "Description" : {
"de" : "Für Frodo",
        "en" : "For Frodo",
"es" : "Para Frodo",
"fr" : "Pour Frodo",
"it" : "For Frodo",
"pl" : "Dla Froda",
"pt" : "For Frodo",
"ru" : "For Frodo",
"zh" : "For Frodo"
    },
    "Author" : "Peardox",
    "ModVersion": "1.2",
    "SupportedGameVersion" : {
        "Min" : "1.1.0",
        "Max" : "1.2.0"
    }
}

OK Fair warning has been applied

 

I'm gonna move the domain to https://perspak.com early Feb but will keep all content

 

There are reasons behind this move which basically boil down to unifying my release schedule

 

My friends are welcome to play (I'll set you up your own areas if you desire them)

 

Please note that this process is messy so may take a few weeks 

Link to comment
Share on other sites

I allways see the guid generator. Thats not needed at all. The rule is to only use hex digits, and then you can create numbers like this:

With a prefix for you self and an count for your mods. That way will make it more easy to track down a modded file and brings some ordering in the mods in general.

 

 

"$type": "Game.GameData.WeaponGameData, Assembly-CSharp",
"DebugName": "First_Mod_Great_Sword",
"ID": "AA000000-0000-0000-0000-000000000001",
  • Like 3
Link to comment
Share on other sites

 

I allways see the guid generator. Thats not needed at all. The rule is to only use hex digits, and then you can create numbers like this:

With a prefix for you self and an count for your mods. That way will make it more easy to track down a modded file and brings some ordering in the mods in general.

"$type": "Game.GameData.WeaponGameData, Assembly-CSharp",
"DebugName": "First_Mod_Great_Sword",
"ID": "AA000000-0000-0000-0000-000000000001",

You may want to instead generate most of the GUID randomly and use a small chunk for counting (e.g. "544a30f4-b90e-451b-bb2d-fadc88000001").  Random GUIDs are useful because they are statistically guaranteed to be unique, but the less of the GUID you generate randomly, the more likely it'll conflict with one in someone else's mod.

  • Like 1
Link to comment
Share on other sites

 

I'm almost ready for the next part

 

If anyone can fix the translations before I write it....

 

{
    "Title" : {
"de" : "First Mod",
        "en" : "First Mod",
"es" : "First Mod",
"fr" : "First Mod",
"it" : "Prima Mod",
"pl" : "Pierwszy Mod",
"pt" : "First Mod",
"ru" : "First Mod",
"zh" : "First Mod"
    },
    "Description" : {
"de" : "Für Frodo",
        "en" : "For Frodo",
"es" : "Para Frodo",
"fr" : "Pour Frodo",
"it" : "For Frodo",
"pl" : "Dla Froda",
"pt" : "For Frodo",
"ru" : "For Frodo",
"zh" : "For Frodo"
    },
    "Author" : "Peardox",
    "ModVersion": "1.2",
    "SupportedGameVersion" : {
        "Min" : "1.1.0",
        "Max" : "1.2.0"
    }
}

 

 

It's "it" : "Per Frodo"

Edited by kilay
Link to comment
Share on other sites

Q for peardox: you mention having to have a save before ever talking to the vendor, but in my save I used the temple vendor in Sacred Stair as my vendor and I've talked to her plenty before, and the items seem to show up just fine. Same for, say, TT1's items- I've chatted with the Wild Mare vendor a million times. Why do you need a "fresh" save?

  • Like 1
Link to comment
Share on other sites

Q for peardox: you mention having to have a save before ever talking to the vendor, but in my save I used the temple vendor in Sacred Stair as my vendor and I've talked to her plenty before, and the items seem to show up just fine. Same for, say, TT1's items- I've chatted with the Wild Mare vendor a million times. Why do you need a "fresh" save?

 

I guess that this is just related to the tutorial process , so you can avoid the waiting process for the stacks refresh and load quickly for testing.

If not you can wait 25 hours and the vendor inventory will be refreshed with the new item.

Link to comment
Share on other sites

Q for peardox: you mention having to have a save before ever talking to the vendor, but in my save I used the temple vendor in Sacred Stair as my vendor and I've talked to her plenty before, and the items seem to show up just fine. Same for, say, TT1's items- I've chatted with the Wild Mare vendor a million times. Why do you need a "fresh" save?

 

A save - at least before 1.2.2 (not sure now) saves a bit too much data.

 

I have provable saves that illustrate this issue

 

So - go to a vendor BEFORE you activate your mod and save then again AFTER you do your mod

 

The result is the AFTER mod won't have your new item but your BEFORE mod will

 

We've made the Devs aware of this - I have a way around it but this involves hacking a savegame so hope this gets in 1.2.2 / 2.0.0

 

Convo Mods appear immune to this (for everyone else)

OK Fair warning has been applied

 

I'm gonna move the domain to https://perspak.com early Feb but will keep all content

 

There are reasons behind this move which basically boil down to unifying my release schedule

 

My friends are welcome to play (I'll set you up your own areas if you desire them)

 

Please note that this process is messy so may take a few weeks 

Link to comment
Share on other sites

@house2fly

Yep - confirmed this is still broken

 

From what I can tell if you go into a new area you're safe

If you DONT talk to the vendor, see their shop + save you're still fine

Lastly TALK and see what she has

 

Install a Mod I purposely use Shatusi (or whatever) as it's easy to get to with https://www.nexusmods.com/pillarsofeternity2/mods/125 (one of mine)

 

Two final tests - stick my (or anyone else's vendor)

 

Go back to Eofonia from PM and you get a load of extra items

 

Reload your saves - 2nd works, 3rd don't

 

We've been discussing this for over a month

OK Fair warning has been applied

 

I'm gonna move the domain to https://perspak.com early Feb but will keep all content

 

There are reasons behind this move which basically boil down to unifying my release schedule

 

My friends are welcome to play (I'll set you up your own areas if you desire them)

 

Please note that this process is messy so may take a few weeks 

Link to comment
Share on other sites

  • 2 weeks later...

This is a wonderful tutorial peardox. Even beginners like me can follow it :)

 

So I'm going to be brave and try making my own custom weapon.

 

I just have one question about the GUID. If I replace the first 3 entries with kex would that count as a unique GUID?

 

For example, your original sword's ID was: "ID": "3530e7a2-ec4f-4d5f-a436-53e26ed3e075",

 

If I changed it to: "ID": "kex0e7a2-ec4f-4d5f-a436-53e26ed3e075",

 

Would that work?

Link to comment
Share on other sites

This is a wonderful tutorial peardox. Even beginners like me can follow it :)

 

So I'm going to be brave and try making my own custom weapon.

 

I just have one question about the GUID. If I replace the first 3 entries with kex would that count as a unique GUID?

 

For example, your original sword's ID was: "ID": "3530e7a2-ec4f-4d5f-a436-53e26ed3e075",

 

If I changed it to: "ID": "kex0e7a2-ec4f-4d5f-a436-53e26ed3e075",

 

Would that work?

 

Nope

 

use that to create new GUID  (use 4 UUID , the one in the middle of the page)

Link to comment
Share on other sites

 

This is a wonderful tutorial peardox. Even beginners like me can follow it :)

 

So I'm going to be brave and try making my own custom weapon.

 

I just have one question about the GUID. If I replace the first 3 entries with kex would that count as a unique GUID?

 

For example, your original sword's ID was: "ID": "3530e7a2-ec4f-4d5f-a436-53e26ed3e075",

 

If I changed it to: "ID": "kex0e7a2-ec4f-4d5f-a436-53e26ed3e075",

 

Would that work?

 

Nope

 

use that to create new GUID  (use 4 UUID , the one in the middle of the page)

 

 

Ha! Typical, it couldn't be that simple could it?

 

Thanks kilay.

Link to comment
Share on other sites

Peardox I'm going to post my progress step by step. Not just for my benefit, but for others who might like to try this for themselves (and can learn from my mistakes).

 

But if you'd rather I didn't post in your thread, just let me know and I'll delete it and start a new thread (this may get a bit long :grin: ).

 

Anyway, I've made a start on my mod. I've decided to make an overpowered Blunderbuss that I'm going to call 'BadAss' (don't judge me, I'm trying to learn :dancing:).

 

To make things easier, I've cloned an existing Blunderbuss: https://pillarsofeternity.gamepedia.com/Hand_Mortar

 

I've looked through the gamedatabundle files and I think I'll need to copy three entries:

 

WeaponGameData (found in items.gamedatabundle)

AttackFirearmGameData (found in attacks.gamedatabundle)

AttackAoEGameData (found in attacks.gamedatabundle)

 

So this is what my BadAss.gamedatabundle file currently looks like (without any changes made yet):

{
	"GameDataObjects": [{
			"$type": "Game.GameData.WeaponGameData, Assembly-CSharp",
			"DebugName": "Blunderbuss_U_Serafen_HandMortar",
			"ID": "f9fe1673-3d38-48aa-b8cf-3a20c4d966a2",
			"Components": [{
					"$type": "Game.GameData.ItemComponent, Assembly-CSharp",
					"DisplayName": 3548,
					"DescriptionText": 3796,
					"FilterType": "Weapons",
					"InventoryAudioEventListID": "57518815-1aa8-49c2-8ee0-0d361b26fd66",
					"IsQuestItem": "false",
					"IsIngredient": "false",
					"IsCurrency": "false",
					"IsAdventuringItem": "false",
					"CanSellForFullValue": "false",
					"MaxStackSize": 1,
					"NeverDropAsLoot": "false",
					"CanBePickpocketed": "true",
					"IsUnique": "true",
					"Value": 35,
					"IconTextureSmall": "gui/icons/items/weapons/blunderbuss/blunderbuss_01_s.png",
					"IconTextureLarge": "gui/icons/items/weapons/blunderbuss/blunderbuss_01_l.png",
					"PencilSketchTexture": "",
					"InspectOnUseButton": [],
					"IsPlaceholder": "false"
				}, {
					"$type": "Game.GameData.EquippableComponent, Assembly-CSharp",
					"EquipmentType": "Blunderbuss",
					"EquipmentSlot": "AnyWeapon",
					"AppearancePiece": {
						"ModelVisualDataPath": "prefabs/items/appearance/weapons/blunderbuss/a_blunderbuss03_v01.asset"
					},
					"ItemModsIDs": ["fea57a9e-7dc1-4f66-8617-1e2f87c0f376", "7d7b81f7-7322-441f-a366-5d15d30379f5", "2dcb5f72-2a69-45c6-a438-3e93a58459a5"],
					"OnEquipVisualEffects": [],
					"RestrictedToClass": [],
					"RestrictedToPlayer": "false",
					"ProficientAbilityID": "f5a2eb61-8c11-41ab-9832-5ad182e5b368",
					"CannotUnequip": "false",
					"ItemRendererPrefab": "prefabs/itemrenderers/genericanimateditemrenderer.prefab",
					"ItemModel": "",
					"AnimationController": "art/animation/animationcontrollers/weapon/w_pistol.controller",
					"PaperdollOverrideRenderer": "",
					"AttackSummonID": "00000000-0000-0000-0000-000000000000",
					"CannotSheathe": "false",
					"PropVisualEffects": []
				}, {
					"$type": "Game.GameData.WeaponComponent, Assembly-CSharp",
					"Stance": "OneHanded",
					"AnimationStanceID": "ddeda306-872b-4d63-8032-fbaf359d0ed2",
					"StatusEffectsOnLaunchIDs": [],
					"IsDisplayedWhenAlternate": "true",
					"IsUniversalType": "false",
					"AttackID": "2af49303-b215-42aa-b933-7b0497a1c19d",
					"NoiseLevelID": "6bfdad12-a1d0-42cc-b797-c9d2dac2af05",
					"ForceBackScabbard": "false",
					"ScabbardAppearancePiece": {
						"ModelVisualDataPath": ""
					},
					"ScabbardRendererPrefab": "",
					"ScabbardModel": "",
					"AudioEventListID": "00000000-0000-0000-0000-000000000000"
				}
			]
		},{
			"$type": "Game.GameData.AttackFirearmGameData, Assembly-CSharp",
			"DebugName": "Blunderbuss_Serafen",
			"ID": "2af49303-b215-42aa-b933-7b0497a1c19d",
			"Components": [{
					"$type": "Game.GameData.AttackBaseComponent, Assembly-CSharp",
					"KeywordsIDs": ["f25230f4-fca2-44af-b745-03f026152459", "1b6d77c8-1155-4d49-9c7c-548716f0d409", "d0cef78d-856b-4d8c-82d2-59c1ed2aa396"],
					"AttackDistance": 5,
					"MinAttackDistance": 0,
					"AttackVariationID": "7da22f9e-cd53-4546-86cc-c2d150df72cb",
					"CastSpeedID": "eacb53e3-6eb5-422a-92ca-99cc883ae4a9",
					"RecoveryTimeID": "039ef4b4-eeb3-42d3-9817-a8df05c53515",
					"ImpactDelay": 0,
					"ForcedTarget": "None",
					"AffectedTargetType": "All",
					"AffectedTargetConditional": {
						"Conditional": {
							"Operator": 0,
							"Components": []
						}
					},
					"AffectedTargetDeathState": "Alive",
					"HostilityOverride": "Default",
					"PushDistance": 0,
					"FaceTarget": "true",
					"AccuracyBonus": 0,
					"PenetrationRating": 6,
					"DamageData": {
						"DamageType": "Pierce",
						"AlternateDamageType": "Slash",
						"Minimum": 11,
						"Maximum": 15,
						"DamageProcs": []
					},
					"Require****Object": "true",
					"StatusEffectKeywordsIDs": [],
					"StatusEffectsIDs": [],
					"RandomizeStatusEffect": "false",
					"CanGraze": "false",
					"CanCrit": "true",
					"DefendedBy": "Reflex",
					"AfflictionsDefendedBy": "None",
					"AfflictionApplicationModifier": "None",
					"SubstituteHitVisualEffect": "",
					"VisualEffects": [{
							"VisualEffect": "prefabs/effects/items/weapons/fx_action_flash_launch_01.prefab",
							"AttachPoint": "Fx_Bone_02",
							"AttachObject": "Caster",
							"AttachMode": "Attach",
							"MeshType": "None",
							"Event": "OnAnimEvent",
							"AnimEventID": 0,
							"Loop": "false",
							"Scale": "false"
						}, {
							"VisualEffect": "prefabs/effects/items/weapons/fx_muzzle_flash_launch_blunderbuss.prefab",
							"AttachPoint": "Fx_Bone_01",
							"AttachObject": "Caster",
							"AttachMode": "PositionRotation",
							"MeshType": "None",
							"Event": "OnLaunch",
							"AnimEventID": 0,
							"Loop": "false",
							"Scale": "false"
						}, {
							"VisualEffect": "prefabs/effects/items/weapons/fx_arquebus_smoke_linger.prefab",
							"AttachPoint": "Fx_Bone_01",
							"AttachObject": "Caster",
							"AttachMode": "Attach",
							"MeshType": "None",
							"Event": "OnLaunch",
							"AnimEventID": 0,
							"Loop": "false",
							"Scale": "false"
						}, {
							"VisualEffect": "prefabs/effects/items/weapons/fx_blunderbuss_serafen_aoe.prefab",
							"AttachPoint": "Chest",
							"AttachObject": "Target",
							"AttachMode": "Position",
							"MeshType": "None",
							"Event": "OnImpact",
							"AnimEventID": 0,
							"Loop": "false",
							"Scale": "false"
						}
					],
					"AttackOnImpactID": "00000000-0000-0000-0000-000000000000",
					"ExtraAttackID": "c18ff541-cf07-4d0c-ad70-70410aed948f",
					"LaunchBone": "Fx_Bone_01",
					"HitBone": "Chest",
					"OnHitShakeDuration": "None",
					"OnHitShakeStrength": "None",
					"NoiseLevelID": "82bc1ce9-3a81-41ca-a61a-cc1f73a53de7",
					"AllReactNoise": "false",
					"InterruptsOn": "None",
					"InterruptType": "Normal",
					"TargetAngle": 0,
					"ApplyOnceOnly": "false",
					"PathsToTarget": "true",
					"HideFromCombatLog": "false",
					"DoesNotApplyDamage": "false",
					"TreatAsWeapon": "false",
					"BounceData": {
						"Bounces": 0,
						"Multiplier": 0.5,
						"Range": 2,
						"InRangeOrder": "true",
						"NoRepeatTargets": "false",
						"AlwaysBounceAtEnemies": "true",
						"Delay": 0
					}
				}, {
					"$type": "Game.GameData.AttackRangedComponent, Assembly-CSharp",
					"LaunchAttackOnCollision": "false",
					"ProjectileCount": 1,
					"IgnoreMagicDefense": "false",
					"ProjectileConeAngle": 11,
					"ProjectilePrefab": "prefabs/projectiles/items/fx_blunderbuss_serafen_handmortar_projectile.prefab",
					"IsMultiHit": "false",
					"MultiHitTravelDist": 10,
					"MultiHitMaxHits": 0,
					"LaunchSource": "Caster",
					"LaunchOffset": {
						"x": 0,
						"y": 0,
						"z": 0
					},
					"LaunchOffsetRandom": {
						"x": 0,
						"y": 0,
						"z": 0
					}
				}, {
					"$type": "Game.GameData.AttackFirearmComponent, Assembly-CSharp",
					"ClipSize": 1,
					"ReloadTime": 5,
					"ReloadAnimationEndTime": 1.67,
					"FirearmType": "Pistol"
				}
			]
		}, {
					"$type": "Game.GameData.AttackRangedComponent, Assembly-CSharp",
					"LaunchAttackOnCollision": "false",
					"ProjectileCount": 1,
					"IgnoreMagicDefense": "false",
					"ProjectileConeAngle": 11,
					"ProjectilePrefab": "prefabs/projectiles/items/fx_blunderbuss_serafen_handmortar_projectile.prefab",
					"IsMultiHit": "false",
					"MultiHitTravelDist": 10,
					"MultiHitMaxHits": 0,
					"LaunchSource": "Caster",
					"LaunchOffset": {
						"x": 0,
						"y": 0,
						"z": 0
					},
					"LaunchOffsetRandom": {
						"x": 0,
						"y": 0,
						"z": 0
					}
				}, {
					"$type": "Game.GameData.AttackFirearmComponent, Assembly-CSharp",
					"ClipSize": 1,
					"ReloadTime": 5,
					"ReloadAnimationEndTime": 1.67,
					"FirearmType": "Pistol"
				}
			]
		}, {
			"$type": "Game.GameData.AttackAOEGameData, Assembly-CSharp",
			"DebugName": "Blunderbuss_Serafen_AoE",
			"ID": "c18ff541-cf07-4d0c-ad70-70410aed948f",
			"Components": [{
					"$type": "Game.GameData.AttackBaseComponent, Assembly-CSharp",
					"KeywordsIDs": ["f25230f4-fca2-44af-b745-03f026152459", "1b6d77c8-1155-4d49-9c7c-548716f0d409"],
					"AttackDistance": 4,
					"MinAttackDistance": 0,
					"AttackVariationID": "35abdf41-fc3f-4310-8d5d-5d7da644affc",
					"CastSpeedID": "eacb53e3-6eb5-422a-92ca-99cc883ae4a9",
					"RecoveryTimeID": "566840d9-1561-4243-8ca7-889df9869847",
					"ImpactDelay": 0,
					"ForcedTarget": "None",
					"AffectedTargetType": "Hostile",
					"AffectedTargetConditional": {
						"Conditional": {
							"Operator": 0,
							"Components": []
						}
					},
					"AffectedTargetDeathState": "Alive",
					"HostilityOverride": "Default",
					"PushDistance": 0,
					"FaceTarget": "false",
					"AccuracyBonus": 0,
					"PenetrationRating": 6,
					"DamageData": {
						"DamageType": "Pierce",
						"AlternateDamageType": "Slash",
						"Minimum": 5,
						"Maximum": 8,
						"DamageProcs": []
					},
					"Require****Object": "false",
					"StatusEffectKeywordsIDs": [],
					"StatusEffectsIDs": [],
					"RandomizeStatusEffect": "false",
					"CanGraze": "false",
					"CanCrit": "true",
					"DefendedBy": "Reflex",
					"AfflictionsDefendedBy": "None",
					"AfflictionApplicationModifier": "None",
					"SubstituteHitVisualEffect": "",
					"VisualEffects": [],
					"AttackOnImpactID": "00000000-0000-0000-0000-000000000000",
					"ExtraAttackID": "00000000-0000-0000-0000-000000000000",
					"LaunchBone": "RightWeapon",
					"HitBone": "Chest",
					"OnHitShakeDuration": "None",
					"OnHitShakeStrength": "None",
					"NoiseLevelID": "15743f94-1026-40b0-8e13-a667b3f66f63",
					"AllReactNoise": "false",
					"InterruptsOn": "None",
					"InterruptType": "Normal",
					"TargetAngle": 0,
					"ApplyOnceOnly": "false",
					"PathsToTarget": "true",
					"HideFromCombatLog": "false",
					"DoesNotApplyDamage": "false",
					"TreatAsWeapon": "false",
					"BounceData": {
						"Bounces": 0,
						"Multiplier": 0.5,
						"Range": 10,
						"InRangeOrder": "false",
						"NoRepeatTargets": "false",
						"AlwaysBounceAtEnemies": "false",
						"Delay": 0
					}
				}, {
					"$type": "Game.GameData.AttackAOEComponent, Assembly-CSharp",
					"BlastSize": "Small",
					"BlastRadiusOverride": 5,
					"DamageAngle": 360,
					"ExcludePrimaryTarget": "true",
					"IgnoreParentTarget": "true",
					"ExcludeSelf": "false",
					"BlastPhysicsForce": 500,
					"PushFromCaster": "false"
				}, {
					"$type": "Game.GameData.AttackRangedComponent, Assembly-CSharp",
					"LaunchAttackOnCollision": "false",
					"ProjectileCount": 1,
					"IgnoreMagicDefense": "true",
					"ProjectileConeAngle": 145,
					"ProjectilePrefab": "prefabs/projectiles/invisible_projectile.prefab",
					"IsMultiHit": "false",
					"MultiHitTravelDist": 10,
					"MultiHitMaxHits": 0,
					"LaunchSource": "Caster",
					"LaunchOffset": {
						"x": 0,
						"y": 0,
						"z": 0
					},
					"LaunchOffsetRandom": {
						"x": 0,
						"y": 0,
						"z": 0
					}
				}
			]
		}
	]
}

Ok, that's step 1 finished. Hope it looks ok.

Edited by Kexby
Link to comment
Share on other sites

Step 2.

 

I've given all 3 entries new unique GUIDs and DeBugNames.

 

And created an items.stringtable file and changed the Display Name and Description Text.

 

New BadAss.gamedatabundle:

{
	"GameDataObjects": [{
			"$type": "Game.GameData.WeaponGameData, Assembly-CSharp",
			"DebugName": "Blunderbuss_U_BadAss",
			"ID": "7af150f7-e979-43f1-9df1-3b58c90478b7",
			"Components": [{
					"$type": "Game.GameData.ItemComponent, Assembly-CSharp",
					"DisplayName": 66650,
					"DescriptionText": 66651,
					"FilterType": "Weapons",
					"InventoryAudioEventListID": "57518815-1aa8-49c2-8ee0-0d361b26fd66",
					"IsQuestItem": "false",
					"IsIngredient": "false",
					"IsCurrency": "false",
					"IsAdventuringItem": "false",
					"CanSellForFullValue": "false",
					"MaxStackSize": 1,
					"NeverDropAsLoot": "false",
					"CanBePickpocketed": "true",
					"IsUnique": "true",
					"Value": 35,
					"IconTextureSmall": "gui/icons/items/weapons/blunderbuss/blunderbuss_01_s.png",
					"IconTextureLarge": "gui/icons/items/weapons/blunderbuss/blunderbuss_01_l.png",
					"PencilSketchTexture": "",
					"InspectOnUseButton": [],
					"IsPlaceholder": "false"
				}, {
					"$type": "Game.GameData.EquippableComponent, Assembly-CSharp",
					"EquipmentType": "Blunderbuss",
					"EquipmentSlot": "AnyWeapon",
					"AppearancePiece": {
						"ModelVisualDataPath": "prefabs/items/appearance/weapons/blunderbuss/a_blunderbuss03_v01.asset"
					},
					"ItemModsIDs": ["fea57a9e-7dc1-4f66-8617-1e2f87c0f376", "7d7b81f7-7322-441f-a366-5d15d30379f5", "2dcb5f72-2a69-45c6-a438-3e93a58459a5"],
					"OnEquipVisualEffects": [],
					"RestrictedToClass": [],
					"RestrictedToPlayer": "false",
					"ProficientAbilityID": "f5a2eb61-8c11-41ab-9832-5ad182e5b368",
					"CannotUnequip": "false",
					"ItemRendererPrefab": "prefabs/itemrenderers/genericanimateditemrenderer.prefab",
					"ItemModel": "",
					"AnimationController": "art/animation/animationcontrollers/weapon/w_pistol.controller",
					"PaperdollOverrideRenderer": "",
					"AttackSummonID": "00000000-0000-0000-0000-000000000000",
					"CannotSheathe": "false",
					"PropVisualEffects": []
				}, {
					"$type": "Game.GameData.WeaponComponent, Assembly-CSharp",
					"Stance": "OneHanded",
					"AnimationStanceID": "ddeda306-872b-4d63-8032-fbaf359d0ed2",
					"StatusEffectsOnLaunchIDs": [],
					"IsDisplayedWhenAlternate": "true",
					"IsUniversalType": "false",
					"AttackID": "2af49303-b215-42aa-b933-7b0497a1c19d",
					"NoiseLevelID": "6bfdad12-a1d0-42cc-b797-c9d2dac2af05",
					"ForceBackScabbard": "false",
					"ScabbardAppearancePiece": {
						"ModelVisualDataPath": ""
					},
					"ScabbardRendererPrefab": "",
					"ScabbardModel": "",
					"AudioEventListID": "00000000-0000-0000-0000-000000000000"
				}
			]
		}, {
			"$type": "Game.GameData.AttackFirearmGameData, Assembly-CSharp",
			"DebugName": "Blunderbuss_BadAss",
			"ID": "75e41a87-9eb2-4062-8127-f8f2b121a9e3",
			"Components": [{
					"$type": "Game.GameData.AttackBaseComponent, Assembly-CSharp",
					"KeywordsIDs": ["f25230f4-fca2-44af-b745-03f026152459", "1b6d77c8-1155-4d49-9c7c-548716f0d409", "d0cef78d-856b-4d8c-82d2-59c1ed2aa396"],
					"AttackDistance": 5,
					"MinAttackDistance": 0,
					"AttackVariationID": "7da22f9e-cd53-4546-86cc-c2d150df72cb",
					"CastSpeedID": "eacb53e3-6eb5-422a-92ca-99cc883ae4a9",
					"RecoveryTimeID": "039ef4b4-eeb3-42d3-9817-a8df05c53515",
					"ImpactDelay": 0,
					"ForcedTarget": "None",
					"AffectedTargetType": "All",
					"AffectedTargetConditional": {
						"Conditional": {
							"Operator": 0,
							"Components": []
						}
					},
					"AffectedTargetDeathState": "Alive",
					"HostilityOverride": "Default",
					"PushDistance": 0,
					"FaceTarget": "true",
					"AccuracyBonus": 0,
					"PenetrationRating": 6,
					"DamageData": {
						"DamageType": "Pierce",
						"AlternateDamageType": "Slash",
						"Minimum": 11,
						"Maximum": 15,
						"DamageProcs": []
					},
					"Require****Object": "true",
					"StatusEffectKeywordsIDs": [],
					"StatusEffectsIDs": [],
					"RandomizeStatusEffect": "false",
					"CanGraze": "false",
					"CanCrit": "true",
					"DefendedBy": "Reflex",
					"AfflictionsDefendedBy": "None",
					"AfflictionApplicationModifier": "None",
					"SubstituteHitVisualEffect": "",
					"VisualEffects": [{
							"VisualEffect": "prefabs/effects/items/weapons/fx_action_flash_launch_01.prefab",
							"AttachPoint": "Fx_Bone_02",
							"AttachObject": "Caster",
							"AttachMode": "Attach",
							"MeshType": "None",
							"Event": "OnAnimEvent",
							"AnimEventID": 0,
							"Loop": "false",
							"Scale": "false"
						}, {
							"VisualEffect": "prefabs/effects/items/weapons/fx_muzzle_flash_launch_blunderbuss.prefab",
							"AttachPoint": "Fx_Bone_01",
							"AttachObject": "Caster",
							"AttachMode": "PositionRotation",
							"MeshType": "None",
							"Event": "OnLaunch",
							"AnimEventID": 0,
							"Loop": "false",
							"Scale": "false"
						}, {
							"VisualEffect": "prefabs/effects/items/weapons/fx_arquebus_smoke_linger.prefab",
							"AttachPoint": "Fx_Bone_01",
							"AttachObject": "Caster",
							"AttachMode": "Attach",
							"MeshType": "None",
							"Event": "OnLaunch",
							"AnimEventID": 0,
							"Loop": "false",
							"Scale": "false"
						}, {
							"VisualEffect": "prefabs/effects/items/weapons/fx_blunderbuss_serafen_aoe.prefab",
							"AttachPoint": "Chest",
							"AttachObject": "Target",
							"AttachMode": "Position",
							"MeshType": "None",
							"Event": "OnImpact",
							"AnimEventID": 0,
							"Loop": "false",
							"Scale": "false"
						}
					],
					"AttackOnImpactID": "00000000-0000-0000-0000-000000000000",
					"ExtraAttackID": "c18ff541-cf07-4d0c-ad70-70410aed948f",
					"LaunchBone": "Fx_Bone_01",
					"HitBone": "Chest",
					"OnHitShakeDuration": "None",
					"OnHitShakeStrength": "None",
					"NoiseLevelID": "82bc1ce9-3a81-41ca-a61a-cc1f73a53de7",
					"AllReactNoise": "false",
					"InterruptsOn": "None",
					"InterruptType": "Normal",
					"TargetAngle": 0,
					"ApplyOnceOnly": "false",
					"PathsToTarget": "true",
					"HideFromCombatLog": "false",
					"DoesNotApplyDamage": "false",
					"TreatAsWeapon": "false",
					"BounceData": {
						"Bounces": 0,
						"Multiplier": 0.5,
						"Range": 2,
						"InRangeOrder": "true",
						"NoRepeatTargets": "false",
						"AlwaysBounceAtEnemies": "true",
						"Delay": 0
					}
				}, {
					"$type": "Game.GameData.AttackRangedComponent, Assembly-CSharp",
					"LaunchAttackOnCollision": "false",
					"ProjectileCount": 1,
					"IgnoreMagicDefense": "false",
					"ProjectileConeAngle": 11,
					"ProjectilePrefab": "prefabs/projectiles/items/fx_blunderbuss_serafen_handmortar_projectile.prefab",
					"IsMultiHit": "false",
					"MultiHitTravelDist": 10,
					"MultiHitMaxHits": 0,
					"LaunchSource": "Caster",
					"LaunchOffset": {
						"x": 0,
						"y": 0,
						"z": 0
					},
					"LaunchOffsetRandom": {
						"x": 0,
						"y": 0,
						"z": 0
					}
				}, {
					"$type": "Game.GameData.AttackFirearmComponent, Assembly-CSharp",
					"ClipSize": 1,
					"ReloadTime": 5,
					"ReloadAnimationEndTime": 1.67,
					"FirearmType": "Pistol"
				}
			]
		}, {
					"$type": "Game.GameData.AttackRangedComponent, Assembly-CSharp",
					"LaunchAttackOnCollision": "false",
					"ProjectileCount": 1,
					"IgnoreMagicDefense": "false",
					"ProjectileConeAngle": 11,
					"ProjectilePrefab": "prefabs/projectiles/items/fx_blunderbuss_serafen_handmortar_projectile.prefab",
					"IsMultiHit": "false",
					"MultiHitTravelDist": 10,
					"MultiHitMaxHits": 0,
					"LaunchSource": "Caster",
					"LaunchOffset": {
						"x": 0,
						"y": 0,
						"z": 0
					},
					"LaunchOffsetRandom": {
						"x": 0,
						"y": 0,
						"z": 0
					}
				}, {
					"$type": "Game.GameData.AttackFirearmComponent, Assembly-CSharp",
					"ClipSize": 1,
					"ReloadTime": 5,
					"ReloadAnimationEndTime": 1.67,
					"FirearmType": "Pistol"
				}
			]
		}, {
			"$type": "Game.GameData.AttackAOEGameData, Assembly-CSharp",
			"DebugName": "Blunderbuss_BadAss_AoE",
			"ID": "c6c55d7b-abd0-4ae8-a377-fc17c83e7fdf",
			"Components": [{
					"$type": "Game.GameData.AttackBaseComponent, Assembly-CSharp",
					"KeywordsIDs": ["f25230f4-fca2-44af-b745-03f026152459", "1b6d77c8-1155-4d49-9c7c-548716f0d409"],
					"AttackDistance": 4,
					"MinAttackDistance": 0,
					"AttackVariationID": "35abdf41-fc3f-4310-8d5d-5d7da644affc",
					"CastSpeedID": "eacb53e3-6eb5-422a-92ca-99cc883ae4a9",
					"RecoveryTimeID": "566840d9-1561-4243-8ca7-889df9869847",
					"ImpactDelay": 0,
					"ForcedTarget": "None",
					"AffectedTargetType": "Hostile",
					"AffectedTargetConditional": {
						"Conditional": {
							"Operator": 0,
							"Components": []
						}
					},
					"AffectedTargetDeathState": "Alive",
					"HostilityOverride": "Default",
					"PushDistance": 0,
					"FaceTarget": "false",
					"AccuracyBonus": 0,
					"PenetrationRating": 6,
					"DamageData": {
						"DamageType": "Pierce",
						"AlternateDamageType": "Slash",
						"Minimum": 5,
						"Maximum": 8,
						"DamageProcs": []
					},
					"Require****Object": "false",
					"StatusEffectKeywordsIDs": [],
					"StatusEffectsIDs": [],
					"RandomizeStatusEffect": "false",
					"CanGraze": "false",
					"CanCrit": "true",
					"DefendedBy": "Reflex",
					"AfflictionsDefendedBy": "None",
					"AfflictionApplicationModifier": "None",
					"SubstituteHitVisualEffect": "",
					"VisualEffects": [],
					"AttackOnImpactID": "00000000-0000-0000-0000-000000000000",
					"ExtraAttackID": "00000000-0000-0000-0000-000000000000",
					"LaunchBone": "RightWeapon",
					"HitBone": "Chest",
					"OnHitShakeDuration": "None",
					"OnHitShakeStrength": "None",
					"NoiseLevelID": "15743f94-1026-40b0-8e13-a667b3f66f63",
					"AllReactNoise": "false",
					"InterruptsOn": "None",
					"InterruptType": "Normal",
					"TargetAngle": 0,
					"ApplyOnceOnly": "false",
					"PathsToTarget": "true",
					"HideFromCombatLog": "false",
					"DoesNotApplyDamage": "false",
					"TreatAsWeapon": "false",
					"BounceData": {
						"Bounces": 0,
						"Multiplier": 0.5,
						"Range": 10,
						"InRangeOrder": "false",
						"NoRepeatTargets": "false",
						"AlwaysBounceAtEnemies": "false",
						"Delay": 0
					}
				}, {
					"$type": "Game.GameData.AttackAOEComponent, Assembly-CSharp",
					"BlastSize": "Small",
					"BlastRadiusOverride": 5,
					"DamageAngle": 360,
					"ExcludePrimaryTarget": "true",
					"IgnoreParentTarget": "true",
					"ExcludeSelf": "false",
					"BlastPhysicsForce": 500,
					"PushFromCaster": "false"
				}, {
					"$type": "Game.GameData.AttackRangedComponent, Assembly-CSharp",
					"LaunchAttackOnCollision": "false",
					"ProjectileCount": 1,
					"IgnoreMagicDefense": "true",
					"ProjectileConeAngle": 145,
					"ProjectilePrefab": "prefabs/projectiles/invisible_projectile.prefab",
					"IsMultiHit": "false",
					"MultiHitTravelDist": 10,
					"MultiHitMaxHits": 0,
					"LaunchSource": "Caster",
					"LaunchOffset": {
						"x": 0,
						"y": 0,
						"z": 0
					},
					"LaunchOffsetRandom": {
						"x": 0,
						"y": 0,
						"z": 0
					}
				}
			]
		}
	]
}

items.stringtable:

<?xml version="1.0" encoding="utf-8"?>
<StringTableFile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Name>game\items</Name>
  <Entries>
    <Entry>
      <ID>66650</ID>
      <DefaultText>BadAss</DefaultText>
      <FemaleText />
    </Entry>
    <Entry>
      <ID>66651</ID>
      <DefaultText>The Baddest Gun</DefaultText>
      <FemaleText />
    </Entry>
  </Entries>  
</StringTableFile>

Now I'm going to test it in game.

Edited by Kexby
Link to comment
Share on other sites

Hmm I've done something wrong. I'm getting an error message.

 

I used the console to GiveItem 7af150f7-e979-43f1-9df1-3b58c90478b7

 

But this is the error I recieved:

 

GameDataNotFoundException: Game Data of type 'ItemGameData' not found for 7af150f7-e979-43f1-9df1-3b58c90478b7

 

What have I done wrong?

 

These are my paths:

 

PillarsOfEternityII_Data\override\BadAss\design\gamedata\BadAss.gamedatabundle

 

PillarsOfEternityII_Data\override\BadAss\localized\en\text\game\items.stringtable

Edited by Kexby
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...