Jump to content

Recommended Posts

Posted (edited)

 

 

Use Notepad ++

This is really comfortable to check gamedatabundle , before you need to convert the bundle in json format with some plugin ( I use JSTool )

 

 

 

 

I highly recommend writing code in Visual Studio Code (https://code.visualstudio.com/). I didn't know jack about JSON when I first starting writing POE2 mods, and I was using notepad++ then as well. However, on one of the dev tutorials here they said they were using it so I thought I'd give it a try. It runs way faster than notepad++ does, at least for me, when loading one of the big gamedatabundle files. It "prettifies" them very quickly as well. But the big bonus for me, in learning JSON, is that it automatically underlines mistaken commas, braces, and brackets for you to show you any errors in your syntax. It's helped me out a lot.

 

You can tell Visual Studio Code that the file you're working in is JSON by clicking in the lower right, which perhaps it will initially say "plain text" and selecting JSON. You can also make it automatically associate JSON as being the language for gamedatabundle files by going to File / Preferences / Settings and entering the following in the right side column under "User Settings":

{
    "git.ignoreMissingGitWarning": true,
    "files.associations": {
        "*.gamedatabundle": "json"
    }
}

Anyway, just my two cents. I love notepad++ as well, but using Visual Studio Code helped this JSON newbie learn quicker and recognize mistakes more easily.

Edited by maplejar
  • Like 3
Posted

Thank you so much Maplejar, I'll definitely look into this. Anything that can point out my mistakes would be a real blessing :).

  • Like 1
Posted

@maplejar is in the process of joining our Slack :)

 

@kexby - in Slack go into #mod-dev to keep the flood out of #general then simply mention someone helpful (gave you some pointers in a PM) so something like...

 

@peardox trying to do an itemmod - care to help me out?

 

Replace me with ppl actually online (broken Internet ATM)

 

Actually #mod-dev is in use a lot ATM so think I'll create a #mod-dev2 and invite everyone so we've got enough space for multiple mod discussions

Hope you're getting the hang of the place @tonpix is doing some instructional stuff. Do you mind if I PM yesterday's PM to him? It describes perfectly the kinda issues new Slack members have

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 

  • 2 weeks later...
Posted (edited)
Not done one of these for a while and it's been requested that we add more content so thought today we'd give you an easy upgrade to First Mod Great Sword

 

This is an expansion of First Mod Great Sword

 

We're going to keep the last version of this item but make it more poweful

 

What we're going to do here is add something called an ItemMod to our copy of Great Sword

 

Check design/gamedata/first_mod.gamedatabundle

 

Here you'll find a section marked "Game.GameData.EquippableComponent"

 

We're going to add out ItemMod to this part

 

Slightly after than bit you'll see "ItemModsIDs": [],

 

Notice the brackets - we can add as many ItemMods to this weapon as we like.

 

Your first port of call is exported\localized\en\text\game\itemmods.stringtable - there 1,055 of them to pick from

 

Ooh - Of Fireballs sounds good

 

    <Entry>

      <ID>163</ID>

      <DefaultText>Of Fireballs</DefaultText>

      <FemaleText />

    </Entry>

 

Lets go find the ID for it

 



{
"$type": "Game.GameData.ItemModGameData, Assembly-CSharp",
"DebugName": "Of_Fireballs",
"ID": "0a8eef84-45a5-43d9-b49f-c872d5ad92dd",
"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": [
"fcef4fde-8d97-40ad-9eb5-99e7e863fdb2"
]
}
]
}



 

Let's add that to our sword in our Game.GameData.EquippableComponent

 

    "ItemModsIDs": ["0a8eef84-45a5-43d9-b49f-c872d5ad92dd"],

 

Save your new version and go buy it from the FishMonger in Port Maje if you ain't already got one (it should upgrade the weapon if you've already got one)

 

We can see a load of similar enhancements if we check both files

 

Let's go crazy! These are random picks, not creating anything specific here...

 

    "ItemModsIDs": ["0a8eef84-45a5-43d9-b49f-c872d5ad92dd", 

                               "83bfd3e9-6de8-45c4-a47c-5055b1bae67b",  

                               "552de71d-6272-40c5-8fdd-dc8ac7d2fb7c"],

 

So there we have it - one powerful sword

 

gsup1.jpg

 

You MAY need to cheat yourself some cash as the thing is expensive now! 

 

We explained how to do this above but will re-iterate here

 

Type ` (a backtick)

Type iroll20s (enable cheats)

Type ` (a backtick)

Type GiveMoney 1000000 (we're now rich)

 

The use of cheats is required when developing a mod

 

You can use GiveItem fe314613-c507-4f86-86d2-dd94b09429e0 to give yourself the First Mod Great Sword for example - no need to arrach it to a vendor while developing the thing

 

This is the start of the more advanced modding stuff. Next time I'll show you how to write your own ItemMod

 

@Kilay - thought you were gonna write some of these?

 

Oops - attach the Mod (idiot)

 

 

first_mod.zip

Edited by peardox
  • 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 

Posted

Oh yeah - the legal stuff

 

Do what you want with first_mod.zip

 

PLEASE change the vendor, I use her for tutorials other than that - no real reqs

 

IF you use the same vendor I use for this thread it can cause issues with the game (it's called a race condition)

 

All information published in this thread is educational and all work on it has been freely supplied as a community effort to help new modders.

It may not look like it but this stuff is not just my work - there are many contributors - mostly translation and art in my case

 

If you check out the convo mod threads (I'll have to merge them with this now we're sticky) many people contributed to that one

 

We share

Read my Sig!

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 

Posted

Oh,

 

I mentioned translation above

 

I've requed translations for all strings in First Mod (French and Spanish are the only ones we can't do yet)

 

If you're a member of our Slack I've automated Google translate for us (outsiders have to do this manually)

 

/poe translate For Frodo!

 

That translates For Frodo! and comes back with...

 

{
   "de": "Für Frodo!",
   "en": "For Frodo!",
   "es": "Para Frodo!",
   "fr": "Pour Frodon!",
   "it": "Per Frodo!",
   "pl": "Dla Frodo!",
   "pt": "Para Frodo!",
   "ru": "Для Фродо!",
   "zh": "对于佛罗多!"
}
 
When you do more complex text it becomes far harder
 
"Give me a Norwegian Blue translates" badly for example - this is correctly translated in Convo Mod

I MAY do a translation tutorial mid-week (dead busy)

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 

Posted

Remember, in the same way you copied and modified the greatsword in step 1, you can copy and modify itemmods, and the abilities and status effects attached to them. They'll need new UUIDs and new names via stringtables, but if you want to make a per-encounter version of Of Fireballs or make that freeze cone attack happen when an enemy misses you rather than when you crit, you have the power to make it happen.

 

(This isn't for peardox's benefit of course, but thought it might be encouraging for anyone following along)

  • Like 1
Posted

That's my next major update to this one

 

Believe me, on this one - I need someone to take my workload off so if you wanna continue feel free

 

Take First Mod and add (yep I have plans)

 

1) New status effects - simply copy Fireball, give it a new ID and more life

 

2) Complete new ItemMod make this a wow - something like a summon (@kilay + @tt1 can help here)

 

That's as far as I've planned today

 

Keep it under (or around) 100 lines - 200 is bad, 25 is bad. AND yep I know I just wrote a bit on Translation that is 'bad' - do what I ask not what I do :)

 

(1) Is easy but has to be explained propelrly

(2) Is much more fun but may need breaking in two

 

KISS my friend (Keep It Simple, Stupid)

 

The people who read this don't have our support mechanism unless they hit the invite link (in my Sig)

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 

Posted

This one may be a little premature but gets on article off my to-do list

 

If you're a member of the team, as mentioned above, we've automated the manual process (see my Sig)

 

So - translation

 

Start here - https://translate.google.com

 

The translations are far from perfect and you need to do them all manually

 

All language codes are ISO 3166 in any chat on this subject

 

POE2 has nine languages, currently but I believe South Korean is available

 

Some of my friends have done language conversions as there are a load of missing strings

 

So...

 

Start in design/localized - it'll give you an idea of what we're trying to do here - pick a langauge you DON'T speak and at least one that you do

All we have to do is create new translations in our override and change some numbers

 

first_mod.zip is a good framework for this as although we didn't translate anything provides a sample of how we do this stuff

 

We have a good count of willing ModDevs who are very happy to translate into your own language - See my Sig!

 

Think I'm the only Brit in our gang but we have MANY members who can do other languages...

 

 

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 

Posted (edited)

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

Edited by peardox

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 

Posted
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

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 

Posted (edited)
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

Edited by peardox

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 

Posted

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

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 

Posted
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

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 

Posted
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...

first_mod_6.png
 
You'll notice that Fireball is now twice per encounter
 
Attached is the final result

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 

  • 4 weeks later...
Posted

Rats - another month with no more new updates (soz)

 

Concentrating on 2.1.0

 

Will do another Tutorial over the w/e to show you a summon (this will be cool)

 

PROMISE this time (very busy)

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 

Posted

I apologise

 

Midnight Sunday and I'm having issues with GenerateLootListInto

 

My intention was to show you this new technique

 

It works but I'm gonna have to do a ground-buildup to get this one working first

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 

Posted (edited)

Rats

 

I've worked out what's wrong

 

SaveGames again...

 

Attatched is my latest build which has First Mod and The Pantry

 

What we're illustrating here is adding multiple lootlists to one NPC

 

[A personal note] Yep, I write all these by myself so why do I write these as "we"? Simple answer, I'm not the only bloke(ess) involved in these Tutorials
I get a HUGE amount of help from our 34 member Slack team - members translate into languages the Mod Author doesn't know, create art, write imaginitive text, advise and test for us
I'm not a one man band - I'm a 34 member band!

All we're done in this Mod is change the vendor to FishMonger in Port Maje - stuck two lootlists in one mod and added a view controller (techie crap that means what you see) - that's in lootlist.gamedatabundle
 
If you start a new game you get the mod
 
If you talk to FishMonger - tough
 
I hoped to make this one positive but sadly ModScriptHook appears to hit cache
 
I HOPE that in 2.1.1 SaveGames simply ignore and ModScriptHook (@BMac)
 
This is a fully functioning Mod but I feel little requirement to explain it (there's one UUID change)
 
This is a full copy of The Pantry (so remove it if you have it installed) with a changed First Sword

first_mod.004.zip

Edited by peardox

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 

  • 11 months later...
Posted
On 8/3/2018 at 6:57 AM, maplejar said:

 

I highly recommend writing code in Visual Studio Code (https://code.visualstudio.com/). I didn't know jack about JSON when I first starting writing POE2 mods, and I was using notepad++ then as well. However, on one of the dev tutorials here they said they were using it so I thought I'd give it a try. It runs way faster than notepad++ does, at least for me, when loading one of the big gamedatabundle files. It "prettifies" them very quickly as well. But the big bonus for me, in learning JSON, is that it automatically underlines mistaken commas, braces, and brackets for you to show you any errors in your syntax. It's helped me out a lot.

 

You can tell Visual Studio Code that the file you're working in is JSON by clicking in the lower right, which perhaps it will initially say "plain text" and selecting JSON. You can also make it automatically associate JSON as being the language for gamedatabundle files by going to File / Preferences / Settings and entering the following in the right side column under "User Settings":


{
    "git.ignoreMissingGitWarning": true,
    "files.associations": {
        "*.gamedatabundle": "json"
    }
}

Anyway, just my two cents. I love notepad++ as well, but using Visual Studio Code helped this JSON newbie learn quicker and recognize mistakes more easily.

there is no column under user settings i cant find it has the program changed or am i jsut stupid?

Posted (edited)

Yep those are the user settings.  It's actually File-->Preferences-->Settings, I was wrong.  When you click on the 3 dots on the side it allows you to put in the code, rather than just toggle options.  Very tricky!

Edited by Grape_You_In_The_Mouth
  • 6 months later...

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...