-
Posts
564 -
Joined
-
Last visited
-
Days Won
2
Content Type
Profiles
Forums
Blogs
Everything posted by peardox
-
Exported prettified JSON
peardox replied to peardox's topic in Pillars of Eternity II: Deadfire: Modding (Spoiler Warning!)
Prettified JSON for 2.0.1 now available @ https://poe2.peardox.com/exported/ This does NOT include Beast Of Winter exported -
I think it would be tricky to do this with global variables since they are, well, global. So you'll have trouble distinguishing whether one character or different characters are wearing the set pieces. The way we'd probably do it internally would be to have each set piece apply a hidden marker status effect, each with a unique custom keyword MySet_Helm, MySet_Armor, etc. Have one of the items grant a custom passive ability that applies the set bonus, with ActivationPrerequisites checking that the character has all the keywords (HasStatusEffectWithKeyword checking Owner). Actually as @Kilay mentions Sets is not the only reason we want globals I was merely theorising on the use requested We also need it for triggers in Conditionals like his Pistols and other things we get asked to write
-
First Mod (spoilers)
peardox replied to peardox's topic in Pillars of Eternity II: Deadfire: Modding (Spoiler Warning!)
For this one we're going to change the FireBall At the moment last_mod gives you 8 charges of FireBall, once they're gone they're gone @House2fly's idea of changing this to PerEncounter seemed a good idea so this version gives you two FireBalls you can use every fight This one is the basis of advanced modding, here we introduce you to ItemMods and Abilities (both are required for this to work) What we're going to do is take the original Of_Fireballs (0a8eef84-45a5-43d9-b49f-c872d5ad92dd) and Of_fireballs_Ability (fcef4fde-8d97-40ad-9eb5-99e7e863fdb2) These can be found in exported/design/gamedata/ .... items.gamedatabundle and abilities.gamedatabundle and create new versions of these with different IDs We'll simply tag "_2" onto the DegugName and give them new ID's then we're going to change the EquippableComponent -> ItemModIDs and replace the original 0a8eef84-45a5-43d9-b49f-c872d5ad92dd to our new ID which is fc126989-a5e6-48da-b1db-32f7fff3f87d We also have to change the AbilitiesOnEquipIDs of our copied ItemMod to "AbilitiesOnEquipIDs": [ "fc126989-a5e6-48da-b1db-32f7fff3f87e" ] This references out new ability, this is in fact the only alteration we're going to make to the ItemMod In the 'borrowed' GenericAbility we're only going to change two lines anding up with ... "UsageType": "PerEncounter", "UsageValue": 2, These are the only changes required to convert Of FireBall into our modified version We simply need to add two add two new components to re-mod First_Mod to do this Find somewhere with a }, { bit and replace it with this lot... },{ "$type": "Game.GameData.ItemModGameData, Assembly-CSharp", "DebugName": "Of_Fireballs_2", "ID": "fc126989-a5e6-48da-b1db-32f7fff3f87d", "Components": [ { "$type": "Game.GameData.ItemModComponent, Assembly-CSharp", "DisplayName": 163, "HideFromUI": "false", "EnchantCategory": "None", "Cost": 2, "DisplayEvenIfCostZero": "false", "CursesItem": "false", "StatusEffectsOnEquipIDs": [], "StatusEffectsOnLaunchIDs": [], "StatusEffectsOnAttackIDs": [], "AbilityModsOnEquipIDs": [], "OnEquipVisualEffects": [], "DamageProcs": [], "AbilitiesOnEquipIDs": [ "fc126989-a5e6-48da-b1db-32f7fff3f87e" ] } ] }, { "$type": "Game.GameData.GenericAbilityGameData, Assembly-CSharp", "DebugName": "Of_fireballs_Ability_2", "ID": "fc126989-a5e6-48da-b1db-32f7fff3f87e", "Components": [ { "$type": "Game.GameData.GenericAbilityComponent, Assembly-CSharp", "KeywordsIDs": [ "f0dbb330-1b06-4175-8ce4-efe790b99213", "3f075d80-787a-493e-bbaa-6da3d6dc2d0f", "054ca597-f957-4549-aa74-a34791938f6f" ], "DisplayName": 191, "Description": 276, "UpgradeDescriptions": [], "UpgradedFromID": "00000000-0000-0000-0000-000000000000", "Vocalization": "GenericSpellCast5", "Icon": "gui\/icons\/abilities\/wizard\/fireball.png", "UsageType": "PerEncounter", "UsageValue": 2, "AbilityClassID": "00000000-0000-0000-0000-000000000000", "AbilityLevel": 3, "IsPassive": "false", "StackingRuleOverride": "Default", "TriggerOnHit": "false", "IsModal": "false", "ModalGroupID": "00000000-0000-0000-0000-000000000000", "IsCombatOnly": "true", "IsNonCombatOnly": "false", "HideFromUI": "false", "HideFromCombatLog": "false", "UniqueSet": "None", "NoiseLevelID": "6bfdad12-a1d0-42cc-b797-c9d2dac2af05", "DurationOverride": 0, "OverrideEmpower": "Default", "ClearsOnMovement": "false", "CannotActivateWhileInStealth": "false", "CannotActivateWhileInvisible": "false", "ActivationPrerequisites": { "Conditional": { "Operator": 0, "Components": [] } }, "ApplicationPrerequisites": { "Conditional": { "Operator": 0, "Components": [] } }, "DeactivationPrerequisites": { "Conditional": { "Operator": 0, "Components": [] } }, "PowerLevelScaling": { "ScalingType": "Default", "BaseLevel": 0, "LevelIncrement": 1, "MaxLevel": 0, "DamageAdjustment": 1, "DurationAdjustment": 1, "BounceCountAdjustment": 0, "ProjectileCountAdjustment": 0, "AccuracyAdjustment": 0, "PenetrationAdjustment": 0 }, "StatusEffectKeywordsIDs": [], "StatusEffectsIDs": [], "VisualEffects": [], "SelfMaterialReplacementID": "00000000-0000-0000-0000-000000000000", "AttackID": "5bc9f76b-2113-409f-81c0-5096e66974be", "AITargetingConditional": { "Conditional": { "Operator": 0, "Components": [] }, "Scripts": [] }, "AudioEventListID": "822d2783-793a-42cc-b9ee-1907ec7343cc" }, { "$type": "Game.GameData.ProgressionUnlockableComponent, Assembly-CSharp" } ] }, { Finally find Of_Fireballs "ItemModsIDs": ["0a8eef84-45a5-43d9-b49f-c872d5ad92dd", And replace it with Of_Fireballs_2 "ItemModsIDs": ["fc126989-a5e6-48da-b1db-32f7fff3f87d", A lot of the both changes we've left untouched from the originals but need including We end up with this... You'll notice that Fireball is now twice per encounter Attached is the final result first_mod.zip -
What Did I Do Wrong?
peardox replied to Wodehouse_44's topic in Pillars of Eternity II: Deadfire: Modding (Spoiler Warning!)
oh - BMac PillarsOfEternityII_Data/output_log.txt is no help in cases like this as you're looking for *gamedatabundle and *stringtable I checked that file before I realised I have extension blindness -
What Did I Do Wrong?
peardox replied to Wodehouse_44's topic in Pillars of Eternity II: Deadfire: Modding (Spoiler Warning!)
You know to me files are files Took me ages to notice the .json extension issue As I say on other places one of the purposes of our team is to help novice Modders Click the Invite link below as there are lots of people who can help in lots of way -
What Did I Do Wrong?
peardox replied to Wodehouse_44's topic in Pillars of Eternity II: Deadfire: Modding (Spoiler Warning!)
Fixed The other thing you had wrong was localized/en/text/game/items.json (it's supposed to be items.stringtable) Oh - one thing I missed was the MAX in manifest.json I used reference items and Waenglith (got sick of cheating it in so just swapped out DP for yours <g>) Don't worry about the mistakes - it's simple to do unless you're experienced like our group and quite easy to miss things that are obvious to some of us. The attached is now fully functional (apart from the MAX in manifest.json I forgot to change - just change it to 2.0.1 and it's perfect) fixed.zip -
What Did I Do Wrong?
peardox replied to Wodehouse_44's topic in Pillars of Eternity II: Deadfire: Modding (Spoiler Warning!)
There's more - I'm in mid-fix (1) Missing ]} as noted (2) It's called itemcoatmod.json, should be itemcoatmod.gamedatabundle (3) Missing strings (looking at this bit now) Possible other things was escaping asset files but not too sure how picky OBS are over this -
First Mod (spoilers)
peardox replied to peardox's topic in Pillars of Eternity II: Deadfire: Modding (Spoiler Warning!)
Last Part (Merged) OK The final payoff... If Part 3 worked for you you're almost done All we need to do is add some scripting to then Search for "NodeID": 106, You'll see a line that says simply... "OnExitScripts": [], This is our does nothing show me a shop (it's the FishMonger's) Change it to this... "OnExitScripts": [ { "Data": { "FullName": "Void OpenStore(Guid)", "Parameters": [ "2c8238c9-99ae-45d3-9d6e-f795c688fd1d" ], "Flags": "", "UnrealCall": "", "FunctionHash": 215165789, "ParameterHash": -391774516 }, "Conditional": { "Operator": 0, "Components": [] } } ], Now lots go TT1's Dead Parrot so just below this one is 107 which we want to change to... "OnExitScripts": [ { "Data": { "FullName": "Void GiveItems(Guid, Int32)", "Parameters": [ "ff10c221-f081-465f-adef-082978010630", "1" ], "Flags": "", "UnrealCall": "", "FunctionHash": 0, "ParameterHash": 0 }, "Conditional": { "Operator": 0, "Components": [] } } ], You can change ff10c221-f081-465f-adef-082978010630 to something else if you ain't got TT1's Parrot Mod installed e.g. ITEM_PET_FlameNagaHatchling is 123bfda8-0639-4a68-bb59-3107a0e692d3 You can make that anything you want that's a valid item Make sure you're completely out of Deadfire (on Desktop) - start the game back up and Waenglith will now sell you fish and give you unlimited free Dead Parrots Attached are convo.zip which is the finished mod and blank.zip which is a load of empty folders to make creating new mods easy (as it can take a while to get the dir structure correct) convo.zip blank.zip -
First Mod (spoilers)
peardox replied to peardox's topic in Pillars of Eternity II: Deadfire: Modding (Spoiler Warning!)
Part 3 (Merged) There will be one more short part to this stuff and I'll include a copy of the finished Mod for you to play around with We've still done nothing that changes the game - let's do something about that! As I said right at the start we're now going to alter, fundimentally, how the game works. There is only one way to do this, and yes, I've explored every override way I can think of (instructions are bugged) What we're going to do next is NOT for release as a MOD - it is, however, an extremely useful experiment for us Modders In your mod directory create conversations/09_port_maje/09_cv_dawnstars_priestess.conversationbundle Note that this goes at the same directory level as design and localized - it does NOT belong in design (as you may expect) Now go through Waenglith's Questions - you're looking for one with "Farewell." in the list - there are two ways to get to this depenfing on whether you've latkked to her before Referencing this text against 09_cv_dawnstars_priestess.stringtable you can see it's ID 24 We're looking for "NodeID": 24, as that's where we're going to patch in a Shop + Parrot If you don't want to use Dead Parrot use anything else e.g. ITEM_PET_FlameNagaHatchling is 123bfda8-0639-4a68-bb59-3107a0e692d3 Lets fund "NodeID": 24, You'll see we have ================================================================ { "$type": "OEIFormats.FlowCharts.Conversations.PlayerResponseNode, OEIFormats", "NotSkippable": false, "IsQuestionNode": false, "HideSpeaker": false, "IsTempText": false, "PlayVOAs3DSound": false, "PlayType": 0, "Persistence": 3, "NoPlayRandomWeight": 0, "VOPositioning": 0, "DisplayType": 1, "NodeID": 24, "ContainerNodeID": -1, "Links": [], "ClassExtender": { "ExtendedProperties": [ "SpeakerAnimation,0", "ListenerAnimation,0", "DoNotClearText,False", "FocusedSpeaker,", "VOEventOverride,None" ] }, "Conditionals": { "Operator": 0, "Components": [] }, "OnEnterScripts": [], "OnExitScripts": [], "OnUpdateScripts": [] }, ================================================================ Copy that node Now, we need to insert our new nodes, these relate directly to our altered StringTable You'll remember the node before our new ones was 72 Search fpr "NodeID": 72, then look for the end of that object It's followed by ================================================================ { "$type": "OEIFormats.FlowCharts.Conversations.ScriptNode, OEIFormats", "RequiresValidChildNode": false, ================================================================ After Node 72's closing }, paste node #24 in twice For our fresh nodes we want to change "NodeID": 24, to 106 + 107 as they pick the text up from our StringTable We've now got two dead nodes that will result in a dialogue option then quit (that's why we took links out) This has created an unused two convo nodes - let's go activate them Search for "ToNodeID": 24, We're going to pit out new nodes in directly before the farewell node (#24) - there are two places this needs to be done as node #24 is part of two dialogue trees so we may as well do them both The section with the "ToNodeID": 24 looks like this ================================================================ { "$type": "OEIFormats.FlowCharts.Conversations.DialogueLink, OEIFormats", "RandomWeight": 1, "PlayQuestionNodeVO": true, "QuestionNodeTextDisplay": 0, "FromNodeID": 3, "ToNodeID": 24, "PointsToGhost": false, "Conditionals": { "Operator": 0, "Components": [] }, "ClassExtender": { "ExtendedProperties": [] } } ================================================================ Paste in the above twice and add a comma to the after the last } in each new object We're looking to have this inserted ================================================================ { "$type": "OEIFormats.FlowCharts.Conversations.DialogueLink, OEIFormats", "RandomWeight": 1, "PlayQuestionNodeVO": true, "QuestionNodeTextDisplay": 0, "FromNodeID": 3, "ToNodeID": 106, "PointsToGhost": false, "Conditionals": { "Operator": 0, "Components": [] }, "ClassExtender": { "ExtendedProperties": [] } }, { "$type": "OEIFormats.FlowCharts.Conversations.DialogueLink, OEIFormats", "RandomWeight": 1, "PlayQuestionNodeVO": true, "QuestionNodeTextDisplay": 0, "FromNodeID": 3, "ToNodeID": 107, "PointsToGhost": false, "Conditionals": { "Operator": 0, "Components": [] }, "ClassExtender": { "ExtendedProperties": [] } }, ================================================================ Repeat this for the other "ToNodeID": 24, - make sure you're not doing the same one! Save this, make sure you're completely out of POE2 - not at menu, at Desktop Start up POE2 with your new mod and go see Waenglith - you should have the two new questions in the conversation (they'll just exit at the moment) Next session (last one, and it's nice + short) I'll show you how to make these dead nodes do something cool -
First Mod (spoilers)
peardox replied to peardox's topic in Pillars of Eternity II: Deadfire: Modding (Spoiler Warning!)
Part 2 (merged) Go pick some useless NPC - I'm going for Waenglith as she's fairly useless and exists to endgame (unless I kill her) so let's go find her converstations which turn out to be at 09_cv_dawnstars_priestess.stringtable in each localised text/conversations directory - let's go copy her Waenglith is the naggy woman where you pick Xoti up - when you enter the area you're actually triggering a different convobundle to add Xoti to your party. Once you've got Xoti we switch to her personal convo mode. This ain't the best choice I could have made but she's early + late game interactible. Her conversationbundle is big and confusing as well which don't help but if I design around a complex NPC you should find others far easier to Mod. I intend to Mod another NPC to do something useful - a non-vendor who does little other than talk bull**** to fill a forum Req for the "Chest Of Consumables" Again I've automated this for you so grab Waenglith.unix / windows and paste that lot into your command prompt making sure you're still in localised Congrats - you've now got something we can play with - data Pointless? Not in the slightest - we now get to play. As I mentioned earlier Waenglith is boring - does very little so let's give her a Shop and gift you Dead Parrots (hence TT1's Mod being required to follow this) You can do this without the Dead Parrot but then you'll have to substitute DP's UUID for some stock item. Additionally I want to take you thru two versions of translation. Translation #1 is from the fish seller on Port Maje Harbour shes in exported/localised/[lang]/text/conversations/09_bs_fishmonger.stringtable You'll see that this is the en text <Entry> <ID>6</ID> <DefaultText>"Let me see what you have."</DefaultText> <FemaleText /> </Entry> We're going to do all the translations (this is optional but personally I'm going to do it) Open your conversation stringtable I'm English so I'll start here + localised + en + text + conversations + 09_cv_dawnstars_priestess.stringtable At the top you'll see <EntryCount>71</EntryCount> - increase it by one to be safe (we're not sure if it's important but better safe than broken Mod) Now, go to the bottom of the file and copy the pinched phrase above just before </Entries> </StringTableFile> We need to increase the ID of our 'borrowed' string - in this case we'll simply add 100 to it so after the edit it looks like this --- Existing --- <Entry> <ID>72</ID> <DefaultText>"I haven't seen Waenglith so riled in a long time. I like you more and more already."</DefaultText> <FemaleText /> </Entry> --- Existing --- --- Added --- <Entry> <ID>106</ID> <DefaultText>"Let me see what you have."</DefaultText> <FemaleText /> </Entry> --- Added --- --- Existing --- </Entries> </StringTableFile> For easy reference this is "Let me see what you have." in nine (9) langauages - the first line of each entry is merely a pointer for myself so I know what goes where de/text/conversations/09_port_maje <Entry> <ID>6</ID> <DefaultText>"Zeig mir, was du anzubieten hast."</DefaultText> <FemaleText /> </Entry> en/text/conversations/09_port_maje <Entry> <ID>6</ID> <DefaultText>"Let me see what you have."</DefaultText> <FemaleText /> </Entry> es/text/conversations/09_port_maje <Entry> <ID>6</ID> <DefaultText>"Déjame ver qué es lo que tienes".</DefaultText> <FemaleText /> </Entry> fr/text/conversations/09_port_maje <Entry> <ID>6</ID> <DefaultText>"Montrez-moi ce que vous avez."</DefaultText> <FemaleText /> </Entry> it/text/conversations/09_port_maje <Entry> <ID>6</ID> <DefaultText>"Fammi vedere cos'hai."</DefaultText> <FemaleText /> </Entry> pl/text/conversations/09_port_maje <Entry> <ID>6</ID> <DefaultText>„Pokaż, co masz na sprzedaż”.</DefaultText> <FemaleText /> </Entry> pt/text/conversations/09_port_maje <Entry> <ID>6</ID> <DefaultText>"Vamos ver o que você tem aí."</DefaultText> <FemaleText /> </Entry> ru/text/conversations/09_port_maje <Entry> <ID>6</ID> <DefaultText>"Покажи, что у тебя есть".</DefaultText> <FemaleText /> </Entry> zh/text/conversations/09_port_maje <Entry> <ID>6</ID> <DefaultText>“让我看看你都有什么好东西吧。”</DefaultText> <FemaleText /> </Entry> Obviously without my existing / added markers and not dupicating #72 If we repeat this process for all languages using their own versions of exported/localised/[lang]/text/conversations/09_bs_fishmonger.stringtable we have a fully translated string in #pos 106 Now let's create some original text which is a good reason for me to watch Python's Parrot sketch I've settled on "Have you got a Norwegian Blue?" - this only makes sense if you understand the joke and will result in the gifting of TT1's Dead Parrot (as presented you can spam DP - there are ways around this I'll explain if anyone wants but as this is a complex subject involving Globals I'm skipping that for this one) So - lets start off patching that into our stringtable at #107 Similarly to above we want a new entry with a new ID <Entry> <ID>107</ID> <DefaultText>"Have you got a Norwegian Blue?"</DefaultText> <FemaleText /> </Entry> This needs to keep our stringtable valid so again needs to go before the </Entries> and we need to update <EntryCount>71</EntryCount> to 73 and save the file. We now repeat this process on all other translations I'll use Google Translate to so them - it's not going to be perfect but until we get some translators available at least we have SOMETHING - it's better than making someone read a language they don't understand. I get - any translation errors, blame Google de - Hast du ein Norwegisches Blau? es - ¿Tienes un azul noruego? en - <We're translating from this one> fr - Avez-vous un bleu norvégien? it - Hai un blu norvegese? pl - Czy masz norweskiego niebieskiego? pt - Você tem um azul norueguês? ru - У вас есть норвежский синий? zh - 你有挪威蓝吗? Note that my zh is assuming its Simple Chinese Apologies to my friends who's native language isn't English, I'm fully aware that the translation may be garbage but the point of this is not for release as a MOD so I'm not that concerned if the translations are bad. The purpose of this is to educate, not teach language skills. Right - armed with our translations we can now Mod all the StringTables We've finally got to a stage of nothing happening but where we can make the changes we want Yeah - we're still at a point of no results for all this work - nobody ever said Modding was easy The next section makes stuff happen - that's the payoff we're all after It's also the most likely place to completely screw everything up If you've followed everything accurately it's time for the deep, dark development hell of putting some new content in place. You'll find by experience 90% of any dev is doing the mundane stuff we've discussed so far - it takes about 10% of the time (a famous 'law') - the next bit takes 90% of the time but results in 10% of the goal. I've been programming for > 35 years so I'm used to it... The grin you get when you get payback makes it all worthwhile. When I finally see Waenglith asking me if I wanna buy something or if I want a Norwegian Blue... I can't express the satisfaction you feel adequately - it's way out there, a Eureka moment (experienced Devs will get what I mean - TT1 - how cool did it feel getting the burn on DP? I know it thrilled me when I made that breakthrough - I'd spent 1/2 a day getting nowhere then I did traps <G>) So cool... The next stage puts me firmly into the 10% for 90% part - I'll do my utmost to get this out today but the 90% wall is about to hit. Hopefully this won't be a nightmare as I've modded her before so know what to look for [@peardox takes an hour or two off to do this and chat to the family] [@peardox takes an hour off off to do this and chat to the family] Waenglith.zip -
First Mod (spoilers)
peardox replied to peardox's topic in Pillars of Eternity II: Deadfire: Modding (Spoiler Warning!)
This is a merge of older mod posts This is a long and complex subject so I'm doing a Part (1, 2, 3 + last) As this is aimed at both newbies and the experienced I've over-detailed the first part (sorry my friends - the more people who know how to this meand more fun Mods) The conversationbundle MOD is NOT recommended until Obsidian fix conversationbundle overrides. Personally I won't release a MOD using this information, I urge fellow Modders to apply the same restriction. I've got some old REQs that would be easy to do this way. The following will re-write some things at a base level - it's not too bad, only some useless NPC For the sake of showing as much useful information I'm going to take a non vendor and turn them into a vendor This process is currently tied to a real vendor to open their shop, there is no current way to create a new shop but this process is a useful to be aware of if/when Obsidian add ModShops So, let's get started... There are many ways to create a Mod, the simplest only have a single file - <something>.gamedatabundle To make things clear to your fellow Modders it is advisable that you use the same layout as found in exported as while the <something>.gamedatabundle can exist anywhere some files, notably stringtables ATM, MUST exist in a specific place in your Mod. As you've, presumably, played the game and quite likely in a language other than English it's notable that there are a LOT of stock phrases you can easily 'borrow'. All you need is the stringtable ID for that phrase to get nine (9) translations of those. For new phrases you can simply use Google Translate to get some text that (hopefully) is close to what you want to say. For the purposes of this tutorial I'm going to use TT1's Dead Parrot, it's my go-to for explaining things so go grab it from https://www.nexusmod...rnity2/mods/111 as this is a Mod item. Install TT1's Uniques (which includes the infamous Parrot) or the rest of this won't work. While this is possible without a Dead Parrot it's far more informative with one as you'll most likely be Modding that includes some of your own special items. So - let's get started... Create a directory in override - I'll call mine convo, name yours whatever you like but make it unique. As this is a Tutorial I'm not concerned about what I call my personal mod as I'm not releasing it. If/when you do a release it is important that you use a unique directory name, personally I call mine pdx-<mod-name> but the choice is yours. In convo (or whatever you call it) we need to create two directories - design and localised We've now got ... convo + design + localised In design we now need to create a gamedata directory and in localised we need a deep structure (lemme just go get one I prepared earlier) convo + design + gamedata + localised + de + text + conversations + game + en + text + conversations + game + es + text + conversations + game + fr + text + conversations + game + it + text + conversations + game + pl + text + conversations + game + pt + text + conversations + game + ru + text + conversations + game + zh + text + conversations + game The text/game directories are there simply for convenience, we're not going to use them but they're handy to have as it is presumed you're going to want your new items translations so thought it advisable to make this as simple as possible OK - that's a lot of typing - let's pick on some naff NPC and automate as much of this as possible First off I should point out that I generally use a Linux Shell as I have Windows, Mac and Linux boxes - you can install a Windows-friendly Ubuntu to make everything work everywhere - see https://docs.microso...l/install-win10 if you want that option. As some people will be put off by this I've created versions of both files to automate stuff for you - take your pick of dirstruct.unix or dirstruct.windows Right - you've created your localised directory... cd localised Take your preferred dirstruct version copy it then paste it into a command prompt making sure you're in localised If everything went OK you've now got a load of directories with nothing in them This is the start of a convo Mod - A lot of nothing. Now we want to add something to our nothing... dirstruct.zip -
Another work-around which defo works is a convo mod - this is how I usually test stuff I just use GiveItem(Guid) when testing This could actually even before 2.1 form a mini-quest, e.g. If you've recruited Aloth I'll give you some cool stuff Convo mods don't have the same problems as lootlists BMac said (somewhere) he's looking into Mod assigned lootlists so that's also hopeful There are a LOAD of useless NPCs (gonna use Darmo for my next one) that serve little purpose that can easily be extended
-
Just updated https://poe.peardox.com/modlist (first version was more a test for my friends) There have been some alterations to it requested - did the easy ones The dates, while not perfect, are close to reality now The list is now reverse-date sorted - i.e. most recent first. One request was that I change the short description to pick out keywords to give an idea of what the request is about without having to read the full request possibly with a hover showing more complete request text (hover won't work on most people's mobile). These are both things I can do, the keywords idea is a good one and has a good chance of (partial) success but is complex to write - i.e. I'll try to get to it... Some obvious enhancements are allowing download links and a Notes section for members of our Mod team for example (we usually just PM the OBS forum members) - there are lots of things that CAN be done, the question is usually is it worth it?
-
Mod Requests
peardox replied to peardox's topic in Pillars of Eternity II: Deadfire: Modding (Spoiler Warning!)
Just updated https://poe.peardox.com/modlist (first version was more a test for my friends) There have been some alterations to it requested - did the easy ones The dates, while not perfect, are close to reality now The list is now reverse-date sorted - i.e. most recent first. One request was that I change the short description to pick out keywords to give an idea of what the request is about without having to read the full request possibly with a hover showing more complete request text (hover won't work on most people's mobile). These are both things I can do, the keywords idea is a good one and has a good chance of (partial) success but is complex to write - i.e. I'll try to get to it... Some obvious enhancements are allowing download links and a Notes section for members of our Mod team for example (we usually just PM the OBS forum members) - there are lots of things that CAN be done, the question is usually is it worth it? -
First Mod (spoilers)
peardox replied to peardox's topic in Pillars of Eternity II: Deadfire: Modding (Spoiler Warning!)
One of our members noticed an issue with String IDs I feel it important to point this out here are if you're an aspiring Modder you should be aware of the problem and a solution we came up with This, AFAIK, only applies to localised/<language>/text/<somethihg.stringtable> We urge you to use REALLY big numbers We have tested this theory and it proves to be true The thing is how do you chose your numbers? We wrote a helper website that has a 2M : 1 chance of getting the same number range as any other developer https://poe.peardox.com/spacereq All future releases of First Mod will be using the above helper This page gives you 1024 numbers to use that are almost guaranteed to NEVER clash with anything else Thanks to @TT1 for finding the issue and pointing us at a workable solution -
[Another cross-post from Modding] This is still a work in progress so kindly forgive the obvious issues (I wanna write a Mod and a Tutorial in the next few days) This is a Beta of a list of all the ModReqs https://poe.peardox.com/modlist We give you a snippet of the request on that page, click one and you'll be taken to the full req (some are quite long) All the dates are messed up, this is owing to us imagining a messaging system would be able to keep with demand - little did we realise how popular this stuff would be. We had to manually modify the system to record all requests in real time so they're not actually in request order. Some reqs have already been filled - something else we need to fix Some reqs are my tests We thought you might like to see what we get asked to write - well, this is the full list - it updates in real time This, as we say, is somewhat of a Beta but will be of interest to Forum Members I've not tried this out on mobile devices yet (I also develop on iOS and Android plus a few less popular devices - FireTV anyone?). This release is designed for browsers (Beta) - it should function OK, you just won't get the hover effects I think
-
Mod Requests
peardox replied to peardox's topic in Pillars of Eternity II: Deadfire: Modding (Spoiler Warning!)
This is still a work in progress so kindly forgive the obvious issues (I wanna write a Mod and a Tutorial in the next few days) This is a Beta of a list of all the ModReqs https://poe.peardox.com/modlist We give you a snippet of the request on that page, click one and you'll be taken to the full req (some are quite long) All the dates are messed up, this is owing to us imagining a messaging system would be able to keep with demand - little did we realise how popular this stuff would be. We had to manually modify the system to record all requests in real time so they're not actually in request order. Some reqs have already been filled - something else we need to fix Some reqs are my tests We thought you might like to see what we get asked to write - well, this is the full list - it updates in real time This, as we say, is somewhat of a Beta but will be of interest to Forum Members I've not tried this out on mobile devices yet (I also develop on iOS and Android plus a few less popular devices - FireTV anyone?). This release is designed for browsers (Beta) - it should function OK, you just won't get the hover effects I think -
Our group has 27 members ATM - only three of us speak only English as our main language (everyone else is OK @English) It has to be understood that some people have very bad English skills (not the only language in the world) Having said that - let's have another go! https://poe.peardox.com/modreq I do feel for the guy Those numbers illustrate why Modders are so important - we've got two members who have done full translation packs (Russian + Italian) There's a 9 to 1 non English community, at least in Modders. There's also an issue with Obsidian getting decent non-English languages done (not checked Beast yet)
-
This APPEARS to be a result of a cached LootList going on what BMac says My best suggestion for this one is OBS-dependant If the Refresh Mods button actually checks ALL saves and invalidates any that are new - another cache issue but less severe Cache mods - something as simple as an MD5 to spot a change would do the job (not secure but we're simply after change in content detection) Might play with this concept next week
-
Actually in 2.1 we should be able to do sets like Diablo / WOW - here's my reasoning... Something myself an @Kilay looked into was globalvariables, I ended up hacking the main bundle as a proof of concept got his pistols - he changed the trigger as we don't wanna hack exported. These @BMac informs us as coming in 2.1.0 This will allow, I think, some scripted to conditionally add a set bonus
-
Useful Tutorials and Links
peardox replied to BMac's topic in Pillars of Eternity II: Deadfire: Modding (Spoiler Warning!)
OK https://poe.peardox.com/spacereq Used a small bit of cryptography on this one (not much and not secure as I usually do) This is specifically to address StringTable ID clash Anyway, this provides a randomised 1024 range of numbers to you that has a minimal chance a clash This is nick based and randomises so you can repeat the process is you need a different range. The chance of a clash is > 2 million to 1 The IDs 0 to 65,535 are left for OBS while the rest is a free-for-all -
ID Clash!
peardox replied to peardox's topic in Pillars of Eternity II: Deadfire: Modding (Spoiler Warning!)
OK https://poe.peardox.com/spacereq Used a small bit of cryptography on this one (not much and not secure as I usually do) Anyway, this provides a randomised 1024 range of numbers to you that has a minimal chance a clash This is nick based and randomises so you can repeat the process is you need a different range. The chance of a clash is > 2 million to 1 The IDs 0 to 65,535 are left for OBS while the rest is a free-for-all Better post this on the links thread as well -
One if my friends just noted a stringtable issue that CAN cause Mod clashes Some of us are using the same numbers for different strings My friend point's out that we've got a BIG range of numbers to chose from so I tested his theory <Entry> <ID>2147480106</ID> <DefaultText>"Let me see what you have."</DefaultText> <FemaleText /> </Entry> There's a LOT of space It's possible to make clashes far less likely If we allow for 64k strings we have 32k available for mapping - so I doubt we'll ever bump numbers My friend is moving his stuff into new numbers to avoid clash What I can do is work out a mapping based on your nick that is almost guaranteed to be exclusive to you How many strings are required per developer? If I allow 1k per ModDev I get nearly 2,100,000 to one chance of a hit - think I'll go with that choice This will take some experimentation but those numbers look good to me You are NOT forced to use this system, clash by all means The result will be your (hopefully) exclusive space with a report like... Use the numbers x to y When I see problems - I try to solve them