peardox Posted July 17, 2018 Posted July 17, 2018 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... https://www.guidgenerator.com/ 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 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
mant2si Posted July 17, 2018 Posted July 17, 2018 (edited) 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 July 17, 2018 by mant2si 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)
kilay Posted July 17, 2018 Posted July 17, 2018 (edited) 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 July 17, 2018 by kilay Random Reader'Plinio il Vecchio asseriva che un rimedio alla sbronza fosse quello di mangiare uova crude di gufo' I° secolo D.C. My Mods on Nexus Nexus Mods Translated to Italian Italian Localization Fix PATCH More Custom AI Conditions Enhanced UI - Afflictions and Inspirations Extended Spell TT1 Unique Items More Priest Subclasses_Ondra Hylea Abydon Channeler Cipher Subclass Are you looking for a group of modders ?Request an invite to our Slack group Do you need a mod? Fill this mod request
mant2si Posted July 17, 2018 Posted July 17, 2018 (edited) 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 July 17, 2018 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)
kilay Posted July 17, 2018 Posted July 17, 2018 (edited) 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 July 17, 2018 by kilay 1 Random Reader'Plinio il Vecchio asseriva che un rimedio alla sbronza fosse quello di mangiare uova crude di gufo' I° secolo D.C. My Mods on Nexus Nexus Mods Translated to Italian Italian Localization Fix PATCH More Custom AI Conditions Enhanced UI - Afflictions and Inspirations Extended Spell TT1 Unique Items More Priest Subclasses_Ondra Hylea Abydon Channeler Cipher Subclass Are you looking for a group of modders ?Request an invite to our Slack group Do you need a mod? Fill this mod request
peardox Posted July 17, 2018 Author Posted July 17, 2018 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
peardox Posted July 17, 2018 Author Posted July 17, 2018 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
peardox Posted July 17, 2018 Author Posted July 17, 2018 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
peardox Posted July 18, 2018 Author Posted July 18, 2018 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 oneThis 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 objectNow let's add it to first_mod.gamedatabundleAs mentioned in Part 1 your mod gamedatabundle can include things in other official bundlesWe'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 IDGo see fishmonger in PM, she's near your eventual Ship Go to her shop and we get this... 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 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
peardox Posted July 18, 2018 Author Posted July 18, 2018 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 postIf you look in the first_mod folder, assuming you've got installed you'll find two files - manifest.json and thumb.pngThe 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 toWe'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 upIf you're doing nothing dangerous simply set Max to 99.0.0 OK - translationsMost of our co-dependant Slack Group (see my sig) don't speak English as their native language but have good English skillsWe'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.jsonThe 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
peardox Posted July 18, 2018 Author Posted July 18, 2018 I'm almost ready for the next partIf 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
Xaratas Posted July 19, 2018 Posted July 19, 2018 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", 3 More modding for PoE II | How to Work with Stringtables
BMac Posted July 19, 2018 Posted July 19, 2018 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. 1
kilay Posted July 19, 2018 Posted July 19, 2018 (edited) 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 July 19, 2018 by kilay Random Reader'Plinio il Vecchio asseriva che un rimedio alla sbronza fosse quello di mangiare uova crude di gufo' I° secolo D.C. My Mods on Nexus Nexus Mods Translated to Italian Italian Localization Fix PATCH More Custom AI Conditions Enhanced UI - Afflictions and Inspirations Extended Spell TT1 Unique Items More Priest Subclasses_Ondra Hylea Abydon Channeler Cipher Subclass Are you looking for a group of modders ?Request an invite to our Slack group Do you need a mod? Fill this mod request
house2fly Posted July 20, 2018 Posted July 20, 2018 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? 1
kilay Posted July 20, 2018 Posted July 20, 2018 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. Random Reader'Plinio il Vecchio asseriva che un rimedio alla sbronza fosse quello di mangiare uova crude di gufo' I° secolo D.C. My Mods on Nexus Nexus Mods Translated to Italian Italian Localization Fix PATCH More Custom AI Conditions Enhanced UI - Afflictions and Inspirations Extended Spell TT1 Unique Items More Priest Subclasses_Ondra Hylea Abydon Channeler Cipher Subclass Are you looking for a group of modders ?Request an invite to our Slack group Do you need a mod? Fill this mod request
peardox Posted July 23, 2018 Author Posted July 23, 2018 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
peardox Posted July 23, 2018 Author Posted July 23, 2018 @house2flyYep - 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
Kexby Posted July 31, 2018 Posted July 31, 2018 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?
kilay Posted July 31, 2018 Posted July 31, 2018 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) Random Reader'Plinio il Vecchio asseriva che un rimedio alla sbronza fosse quello di mangiare uova crude di gufo' I° secolo D.C. My Mods on Nexus Nexus Mods Translated to Italian Italian Localization Fix PATCH More Custom AI Conditions Enhanced UI - Afflictions and Inspirations Extended Spell TT1 Unique Items More Priest Subclasses_Ondra Hylea Abydon Channeler Cipher Subclass Are you looking for a group of modders ?Request an invite to our Slack group Do you need a mod? Fill this mod request
Kexby Posted July 31, 2018 Posted July 31, 2018 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.
Kexby Posted July 31, 2018 Posted July 31, 2018 (edited) 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 ). 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 ). 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 July 31, 2018 by Kexby
Kexby Posted July 31, 2018 Posted July 31, 2018 (edited) 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 July 31, 2018 by Kexby
Kexby Posted July 31, 2018 Posted July 31, 2018 (edited) 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 July 31, 2018 by Kexby
TT1 Posted July 31, 2018 Posted July 31, 2018 (edited) You cannot use letters after F (hexadecimal) on uuid, thats why this is not going to work. Edited July 31, 2018 by TT1
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now