Jump to content

Home

Achilles' item property editing walkthrough *Long*


Achilles

Recommended Posts

Edit tk102: This tutorial will take you through the guts of .uti editing using a GFF Editor. Newer versions of KotOR Tool provide functionality that can be used in lieu of these steps, but this walkthrough will teach you a great deal of the inner connections between the .uti and various .2da files.

 

Resources that you will need to edit item properties:

 

• KotOR Tool – Used to locate and extract templates, models, and skins

• GFF Editor – Program used to edit .uti (item template) files.

 

 

Files that you will need to extract using KT:

 

• None. This walkthrough assumes that you have already successfully created a custom Lightsaber and would like to edit the item properties. If you have not successfully created a custom Lightsaber, please see my walkthrough here:

 

http://www.lucasforums.com/showthread.php?s=&threadid=129450

 

Principles of editing item properties:

 

Editing item properties is very easy to do, however getting past the first mod can be a little difficult. This walkthrough will show you how to edit the properties of a Lightsaber, however by the end of this exercise, you will be able to edit any item in the game. This walkthrough assumes that you have already created a custom saber.

 

Open GFF Editor and then use File>Open to locate the Lightsaber template file that you created (g_w_lghtsbrxx.uti, etc). Open the file.

 

Expand the top level structure by clicking on the + sign.

 

All the nodes in this structure will be listed alphabetically. Locate PropertiesList and expand it by clicking on the + sign.

 

You should see 28 entries. These entries determine the properties that the Lightsaber will have when used with an upgrade crystal. Expand node 0 and let’s take a look at what’s there. You should see the following:

 

ChanceAppear [bYTE] = 100

CostTable [bYTE] = 0

CostValue [WORD] = 0

Param1 [bYTE] = 255

Param1Table [bYTE] = 0

PropertyName [WORD] = 43

Subtype [WORD] = 2

UpgradeType [bYTE] = 24

 

As you will be able to figure out for yourself later, this entry states “this Lightsaber can only be used by Light Side characters when Solari Crystal is added”.

 

Let’s take a moment to examine each of these entries and what they mean.

 

ChanceAppear [bYTE] = 100

 

This entry means that there is a 100% chance that these properties will be applied to this weapon. To the best of my understanding, this will always be 100.

 

The following entries I always think of as pairs.

 

CostTable [bYTE] = 0

CostValue [WORD] = 0

 

As I stated earlier, entries are listed alphabetically, which can be misleading as you will usually only determine what to enter for CostTable after you’ve selected an entry for PropertyName. Each PropertyName entry has a CostTable reference assigned to it which is how CostTable is determined. Similarly, you will select the entry for CostValue based on the CostTable assigned. Don’t worry; hopefully this will all make sense in a few minutes.

 

Param1 [bYTE] = 255

Param1Table [bYTE] = 0

 

These nodes are used to when assigning an On Hit property to your weapon (think “On Hit: Stun 25% chance, 6 seconds, DC10”). These two nodes are paired similarly to CostTable and CostValue

 

PropertyName [WORD] = 43

Subtype [WORD] = 2

 

These are the last of the “paired” nodes. This is where you will usually start when it comes to editing item properties. It all starts with PropertyName. More on this momentarily.

 

UpgradeType [bYTE] = 24

 

The last node in this example can pretty much be ignored. This applies only to items that are going to have special properties when upgraded. Examples include Melee weapons such as Mission’s Vibroblade, Armor such as Republic Mod Armor, Ranged weapons such as Carth’s blaster, or Lightsabers. If you get far enough into this to take on the challenge of making unique upgrades, then you probably don’t need this stinkin’ tutorial, so I won’t waste time going over it here. Just be aware that this is what you want to edit if you want to change upgrade properties. On to the good stuff…

 

Editing item properties:

 

Now that you have a little background on how it work, let’s go over some actual changes. We are going to apply the necessary changes to make a Lightsaber with the following properties.

 

Feats Required:

Weapon Proficiency – Lightsaber

Force Sensitive

 

Damage: Energy, 3-20

Energy, 1d8 vs. Dark Side

Critical Threat: 17-20,x2 +2d6

On Hit: Stun 50% chance, 9 seconds, DC22

Attack Modifier: +5

 

Let’s get started!

 

With your Lightsaber’s .uti file open in GFF Editor (we did this in the first step), open KT.

 

In KT expand BIFs>2da.bif>2d Array. Now locate and open Itempropdef.2da and IPRP_costtable.2da. Itempropdef.2da is where you will find the entries for the properties that you want to add to your weapon, as well as Costtable and Param1 information . Similarly, IPRP_costtable is where you will find the reference for the entry for CostValue. I always open these two tables first, because later, when I have several open, I know where they are in the toolbar.

 

In GFF Editor, right-click on PropertiesList and select Add [user-defined Struct: 0]. This will add node 29 to your list of available nodes (the 28 that were there when we opened the template).

 

Right click on 29 and select [Add BYTE]

Right click on 29 and select [Add BYTE]

Right click on 29 and select [Add WORD]

Right click on 29 and select [Add BYTE]

Right click on 29 and select [Add BYTE]

Right click on 29 and select [Add WORD]

Right click on 29 and select [Add WORD]

 

Next, click on each of the entries and enter the corresponding label in the Field ID area on the right.

 

1st BYTE => ChanceAppear

2nd BYTE => CostTable

1st WORD => CostValue

3rd BYTE => Param1

4th BYTE => Param1Value

2nd WORD => PropertyName

3rd WORD => SubType

 

Go back to ChanceAppear and type 100 into Basic Field Data window on the right.

 

You should now have a new node that looks something like this:

 

+29

ChanceAppear [bYTE] = 100

CostTable [bYTE] = 0

CostValue [WORD] = 0

Param1 [bYTE] = 0

Param1Table [bYTE] = 0

PropertyName [WORD] = 0

Subtype [WORD] = 0

 

Click on node 29 and use Ctrl+C to copy the node. Next, click on PropertiesList and use Ctrl+V to paste the copied node. You should see node 001 added to the list. Don’t worry about remunerating the node, the application will do it for you when you save and close. Use Ctrl+V to paste about 25 copies. You probably won’t use them all, but it’s very easy to delete the nodes you don’t use when you’re finished.

 

Now, let’s begin adding properties to the Lightsaber.

 

Let’s go back to Itempropdef.2da and find the first of the properties that we are going to add. All Lightsabers require that the user have the Weapon Proficiency – Lightsaber feat. Our weapon requires that the user also have the Force Sensitive feat (meaning only your PC can use it, since only he or she has the feat).

 

Looking through Itempropdef.2da, we see that line 57 references the Use_Limitation_Feat property. Now, we go back to our .uti file in GFF Editor, click on the PropertyName entry, and enter 57 in the Basic Field Data window. We have now assigned Use_Limitation_Feat to the Lightsaber, but we’re not finished with this property.

 

Back to Itempropdef.2da. Next to Use_Limitation_Feat in the Label column, we see Feat in the Subtyperesref column. This means that we have to assign an entry from the Feat.2da table to the SubType entry in our .uti file.

 

Go back to KT. Locate and open Feat.2da in the same list where you found IPRP_Costtable.2da and Itempropdef.2da. Ah, another table! Find Force Sensitive in this table (hint: it’s line 116). Now go back to GFF Editor, click on SubType, and enter 116 in the Basic Field Data. First we told the item to limit use to a certain feat, and now we’ve told the item which feat to limit use to. Clever, huh?

 

Back in Itempropdef.2da, we see that there is a column labeled Costtableresref. The number listed here needs to be assigned to CostTable in our .uti file. In this particular case, the Costtableresref is 0. We spend some time drilling down only to find that 0 means 0. The moral of the story is that if Costtableresref is 0, then CostTable and CostValue will be 0 in the .uti file.

 

**Note: four asterisks (****) in the Costtableresref column means that there is no CostTable entry associated with the Property. CostTable and CostValue will remain 0 in these cases.

 

This property edit is complete! Your node should look like this

 

+29

ChanceAppear [bYTE] = 100

CostTable [bYTE] = 0

CostValue [WORD] = 0

Param1 [bYTE] = 0

Param1Table [bYTE] = 0

PropertyName [WORD] = 57

Subtype [WORD] = 116

 

Next, let’s add some damage to your Lightsaber. Expand node 001. Back in Itempropdef.2da we see that the line for Damage is 11 (this goes in PropertyName back in our .uti).

 

Subtyperesref refers us to IPRP_damagetype. Back to KT and open IPRP_damagetype.2da. Please note that default damage type for Lightsabers is Energy. In order to improve the base damage of a Lightsaber, you must select Energy in the IPRP_damagetype table. Energy is line 12, so 12 is what we enter for Subtype in our .uti file.

 

In Itempropdef.2da, we see that we this time we do have a Costtableresref to deal with. This number is entered in Basic Field Data for CostTable in the .uti file. Referencing IPRP_costtable.2da, we see that line 4 refers us to IPRP_damagecost. Now locate and open IPRP_damagecost.2da in KT. Alas, yet another table. Remember that we are going to make this Lightsaber with 3-20 base damage, however the default damage for a Lightsaber is 2-16, a difference of 1d4. Luckily, IPRP_damagecost has an entry for 1d4 (it’s 6). So now we enter 6 for CostValue in our .uti file.

 

Our 2nd property is complete and looks like this:

 

+001

ChanceAppear [bYTE] = 100

CostTable [bYTE] = 4

CostValue [WORD] = 6

Param1 [bYTE] = 0

Param1Table [bYTE] = 0

PropertyName [WORD] = 11

Subtype [WORD] = 12

 

 

On to our 3rd modificiation: Damage vs. Dark Side. Back in Itempropdef.2da, we see that right below Damage, in line number 12 is DamageAlignmentGroup. PropertyName for this edit is 12. Subtyperesref is IPRP_aligngrp and when we open IPRP_aligngrp we see that Dark Side is line 3. This number represents the Subtype. Costtableresref is the same as last time, so again, CostTable is 4. We determined that we were going to add 1d8 vs. Dark Side, so checking IPRP_damagecost.2da, we see that CostValue will be 8. Our finished node should look like this:

 

+002

ChanceAppear [bYTE] = 100

CostTable [bYTE] = 4

CostValue [WORD] = 8

Param1 [bYTE] = 0

Param1Table [bYTE] = 0

PropertyName [WORD] = 12

Subtype [WORD] = 3

 

Hopefully, this is process is pretty clear by now, so we’ll try something a little more challenging: On Hit damage. Using Itempropdef.2da we determine that PropertyName is going to be 32, and that CostTable is going to be 25. We update our .uti file and then check IPRP_onhit to see that our Subtype is going to be 1. Checking IPRP_costtable we see that CostValue is 3. As a side note, line three means that defending characters must have a defense roll of 22 to resist Stun when you score a hit. Line 2 means that they must make a defense roll of 18 to resist and so on.

 

So now we told the weapon that we want to stun our opponent when we make a hit unless they can roll a 22 or better. Looking at most of the stun weapons we see that that the entry reads “Stun 50% chance, 9 seconds, DC22”. It looks like we’ve covered almost all of our bases, except “50% chance, 9 seconds”. I’ll save you the suspense and tell you that it’s now time to use Param1 and Param1Table.

 

Referencing Itempropdef.2da we see that there is, in fact, a column labeled Param1resref, but almost all of the entries (especially the one that we need) are ****. If you remember my earlier side note, you’ll recall that this means 0. Param1 remains 0 in our .uti file. Dead end? Nope. Exploring in KT, we see that there is an item property file labeled IPRP_Onhitdur (as in “dur”ation). Open that up and you’ll see that it has exactly what we’re looking for. The Label and Effectchance columns both reflect the percentage of a successful stun. Durationrounds provides our time limitation (Hint: each round is 3 seconds, therefore 9 second would be 3 rounds. The line we are looking for is number 4 and this goes in Param1Table. See? That wasn’t so bad. Our next node looks like this:

 

+003

ChanceAppear [bYTE] = 100

CostTable [bYTE] = 25

CostValue [WORD] = 3

Param1 [bYTE] = 0

Param1Table [bYTE] = 4

PropertyName [WORD] = 32

Subtype [WORD] = 1

 

Next, let’s alter the critical threat and critical hit damage our Lightsaber can shell out. Again, I’ll save you the suspense by telling you up-front that you alter critical threat range using Keen and critical hit damage using Massive Criticals. Once again back to Itempropdef.2da, we see that Keen is line 28, so we enter that number for our PropertyName, but wait. Subtyperesref, Costtableresref, and Param1resref are all 0’s. We enter 28 in PropertyName and that’s it! How easy is that? Unfortunately, one instance of Keen will only increase the critical threat range by one. The default for a Lightsaber is 19-20,x2 and we’ve now changed it to 18-20,x2. That’s nice, but we can do better. Expand one more node and enter 28 in the PropertyName field again. We’ve now changed to critical threat range to 17-20,x2 (Note: I believe this is the maximum amount that you can increase the range). Nodes 004 and 005 should look like this:

 

+004

ChanceAppear [bYTE] = 100

CostTable [bYTE] = 0

CostValue [WORD] = 0

Param1 [bYTE] = 0

Param1Table [bYTE] = 0

PropertyName [WORD] = 28

Subtype [WORD] = 0

+005

ChanceAppear [bYTE] = 100

CostTable [bYTE] = 0

CostValue [WORD] = 0

Param1 [bYTE] = 0

Param1Table [bYTE] = 0

PropertyName [WORD] = 28

Subtype [WORD] = 0

 

Now for those massive criticals. Check Itempropdef.2da and you’ll see that your PropertyName is going to be 49. Subtype is blank. CostTable is our good ole’ friend number 4 and we have selected number 10 for CostValue. Along with our two Keen entries, our Critical Threat line now looks like this at the Workbench:

 

Critical Threat: 17-20,x2 +2d6

 

Our node looks like this in the .uti file:

 

+006

ChanceAppear [bYTE] = 100

CostTable [bYTE] = 4

CostValue [WORD] = 10

Param1 [bYTE] = 0

Param1Table [bYTE] = 0

PropertyName [WORD] = 49

Subtype [WORD] = 0

 

Lastly, let’s add an Attack Bonus to our Lightsaber. You’re sure to have the hang of this by now, therefore you’ll quickly find that PropertyName is going to be 38, Subtype is 0, CostTable is 2, and CostValue is 5 (because that’s what we picked at the beginning). Our final node looks like this:

 

+007

ChanceAppear [bYTE] = 100

CostTable [bYTE] = 2

CostValue [WORD] = 5

Param1 [bYTE] = 0

Param1Table [bYTE] = 0

PropertyName [WORD] = 38

Subtype [WORD] = 0

 

At this point, you can go ahead and delete the extra nodes that we created using the Delete key. File>Save to save changes, copy the updated file over to the Override folder and replace your earlier mod, and you’re all set. The next time you open the .uti file, you’ll see that GFF Editor automatically changed 001-007 to 30-36 for you.

 

We only touched on part of what you can do with your item properties. Explore and experiment to learn what else you can do! I hope that this walkthrough has been helpful. Please feel free to PM me with comments or suggestions. Thanks for reading.


Link to comment
Share on other sites

  • 7 months later...

Wow!

 

Thanks a lot, Achilles; this is good stuff. I never realized that I had to edit not just the item, but the Itempropdef.2da too...that might be why I've been pounding my head on the desk with my first [feeble] modding attempt!

 

:x-wing:

Link to comment
Share on other sites

Originally posted by tk102

Thank you Achilles. I've added this to the General Tutorials forum. :) It's tricky to describe all the steps in GFF Editor but you've done a great job.

Thanks for the feedback. I wrote this months ago...just before Fred made this info obsolete by adding the necessary functionality to KT :D
Link to comment
Share on other sites

peeks in and reads...and reads...and reads....and reads....

 

Pardon me as my brain just dripped through my ear.... :wornout:

 

Wow Achilles! That's not a walkthrough, that's a Piggy-Back Ride!

 

And although I (personally) try to steer clear from GFF Editor as much as possible, at least now I know there's a very comprehensive tutorial living here :thumbsup:

 

Fantastic Tutorial as always!

Link to comment
Share on other sites

Hopefully, this is process is pretty clear by now, so we’ll try something a little more challenging: On Hit damage. Using Itempropdef.2da we determine that PropertyName is going to be 32, and that CostTable is going to be 25. We update our .uti file and then check IPRP_onhit to see that our Subtype is going to be 1. Checking IPRP_costtable we see that CostValue is 3. As a side note, line three means that defending characters must have a defense roll of 22 to resist Stun when you score a hit. Line 2 means that they must make a defense roll of 18 to resist and so on.

 

hey there great walkthrough.. just one thing i couldnt get that maybe you can explain ... i read through until On Hit.. and decided i should try thatone without reading... so i went through everything and got stuck at CostValue...so i looked at the thread and saw you got 3... ive read and reread but can figure how you got to 3....i dont see anything in IPRP_costtable that shows 3

 

 

can you explain how you got that???

Link to comment
Share on other sites

ok ... disregard that last post... a few things though... i followed the wlkthrough and encountered a few errors

 

i noticed them when i got streff errors in game...

 

one you keep calling it Param1Table... when its Param1Value(not a serious error...just confusing) and secondly at the beggining of the Tut you have it as SubType(note the capitaized letter T) its supposed to be Subtype (all lower case letters asides from the S. that solved my streff error

 

 

one last thing .. i did the Massive criticals and im using a double bladed saber.. i assumed i had to put 3 instances of Keen but when i did i only got it down to 19-20,x2 are doubebades different?????

Link to comment
Share on other sites

Originally posted by sketch42

hey there great walkthrough.. just one thing i couldnt get that maybe you can explain ... i read through until On Hit.. and decided i should try thatone without reading... so i went through everything and got stuck at CostValue...so i looked at the thread and saw you got 3... ive read and reread but can figure how you got to 3....i dont see anything in IPRP_costtable that shows 3

 

 

can you explain how you got that???

Please do not PM me if you are going to ask the exact same question here. Thanks! :D
Link to comment
Share on other sites

i didnt see this thread.. i found the one i read in the locked forum.. i didnt know there where doubles.. i wouldve surely posted instead of Pm'ing you..

Originally posted by Achilles

Please do not PM me if you are going to ask the exact same question here. Thanks! :D

 

and you probably didnt read this post i made look one above yours btw

Originally posted by sketch42

ok ... disregard that last post... a few things though... i followed the wlkthrough and encountered a few errors

 

i noticed them when i got streff errors in game...

 

one you keep calling it Param1Table... when its Param1Value(not a serious error...just confusing) and secondly at the beggining of the Tut you have it as SubType(note the capitaized letter T) its supposed to be Subtype (all lower case letters asides from the S. that solved my streff error

 

 

one last thing .. i did the Massive criticals and im using a double bladed saber.. i assumed i had to put 3 instances of Keen but when i did i only got it down to 19-20,x2 are doubebades different?????

 

In GFF Editor, right-click on PropertiesList and select Add [user-defined Struct: 0]. This will add node 29 to your list of available nodes (the 28 that were there when we opened the template).

 

Right click on 29 and select [Add BYTE]

Right click on 29 and select [Add BYTE]

Right click on 29 and select [Add WORD]

Right click on 29 and select [Add BYTE]

Right click on 29 and select [Add BYTE]

Right click on 29 and select [Add WORD]

Right click on 29 and select [Add WORD]

 

Next, click on each of the entries and enter the corresponding label in the Field ID area on the right.

 

1st BYTE => ChanceAppear

2nd BYTE => CostTable

1st WORD => CostValue

3rd BYTE => Param1

4th BYTE => Param1Value

2nd WORD => PropertyName

3rd WORD => SubType

Link to comment
Share on other sites

Originally posted by sketch42

i didnt see this thread.. i found the one i read in the locked forum.. i didnt know there where doubles.. i wouldve surely posted instead of Pm'ing you..

 

I don't want to bring this thread off-topic, but I would like to clarify something concerning the locked forums:

 

We encourage members to post their questions concerning modding on the public boards as it can help other people who may have the same questions/problems. When you see a thread in the locked forums and you do not find the original thread (some tutorials up there are "brand new"), just start a new thread in the general forums to discuss the tutorial ;) . If new interesting points are brought in this new thread, let us know and we will add them to the tutorials and it will benefit to everyone.

 

 

Let's get back on topic now :)

Link to comment
Share on other sites

Originally posted by sketch42

will do from now on.... :D ... but what should i put for a doubleblaed saber in order to bring the critical threat down to 17 .... since doublebladed critical threat is default at 20-20,x2 i thought that i needed 3 instances of Keen

That's exactly right, although IIRC, the game will only recognize 2. It's been a while so I could be wrong.
Link to comment
Share on other sites

Originally posted by sketch42

but i did that and it still only brought it down to 19-20... do they need to be next to each other ?? cuz first i had set it up exactly the way in the TUT and than later i added one.. would the fact that they arent back to back make a difference?

I don't think they need to be together. Maybe you can only do one. Like I said, it's been a while.
Link to comment
Share on other sites

  • 7 months later...

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...