Revanator

Editing Placeable Inventory (when variable based on class)

Recommended Posts

So I know how to edit the inventory of a placeable. What I don't know is how to make pieces of said inventory dependent on the class of the PC. For example, the first footlocker when you wake up on the Endar Spire. The one you get your clothes from. Soldiers get a blaster rifle, scoundrels a stealth generator, etc.

 

How do I do it? I've found the plcaeable file and the basic inventory only lists 2 medpacs, clothes, and a short sword (consistent among all classes) but the class-specific ones are missing. Where/how do I modify them?

Share this post


Link to post
Share on other sites

AFAIK that can only be done with scripts. This script would then check for the PCs class and add the corresponding items to the placeable.

 

I would guess that this is the OnEnter script for the Endar Spire but maybe it's also somewhere in the very first dialog that the script is triggered. If you can find the uncompiled version of this script or manage to decompile it with DeNCS you could change the items.

Share this post


Link to post
Share on other sites

You would need to extract the k_pend_area01.ncs file from the end_m01aa_s.rim's Scripts, Compiled branch in KotOR Tool's RIMs section.

 

You'd also need DeNCS to decompile the script. Or we'll assume you DL the .nss file below:

 

k_pend_area01.nss

 

In it, you will find the following code (I've added the comments myself):

 

 

 

void sub4() {
	// stringGLOB_13 is the tag of the footlocker object, so the following code grabs that footlocker object.
	object object1 = GetObjectByTag(stringGLOB_13, 0);

	// Get the PC's starting class.
	int int1 = GetClassByPosition(1, GetFirstPC());
	if ((int1 == 2)) { // If Scoundrel, do this/
		CreateItemOnObject(stringGLOB_10, object1, 1);
		CreateItemOnObject(stringGLOB_11, object1, 1);
		CreateItemOnObject(stringGLOB_12, object1, 1);
	}
	else {
		if ((int1 == 1)) { // If Scout, do this.
			CreateItemOnObject(stringGLOB_7, object1, 1);
			CreateItemOnObject(stringGLOB_8, object1, 1);
			CreateItemOnObject(stringGLOB_9, object1, 1);
		}
		else {
			if ((int1 == 0)) { If Soldier, do this.
				CreateItemOnObject(stringGLOB_4, object1, 1);
				CreateItemOnObject(stringGLOB_5, object1, 1);
				CreateItemOnObject(stringGLOB_6, object1, 1);
			}
		}
	}

	// If you have any points in stealth, add this item.
	if (GetHasSkill(2, GetFirstPC())) {
		CreateItemOnObject(stringGLOB_14, object1, 1);
	}
}

 

 

 

You can either change what the strings mean (they're just before all of the functions in the file) or you can copy and modify these lines if you want to add more items here. After this, you compile and drop in the Override folder. :)

Share this post


Link to post
Share on other sites

You would need to extract the k_pend_area01.ncs file from the end_m01aa_s.rim's Scripts, Compiled branch in KotOR Tool's RIMs section.

 

You'd also need DeNCS to decompile the script. Or we'll assume you DL the .nss file below:

 

attachicon.gifk_pend_area01.nss

 

In it, you will find the following code (I've added the comments myself):

 

 

 

void sub4() {
	// stringGLOB_13 is the tag of the footlocker object, so the following code grabs that footlocker object.
	object object1 = GetObjectByTag(stringGLOB_13, 0);

	// Get the PC's starting class.
	int int1 = GetClassByPosition(1, GetFirstPC());
	if ((int1 == 2)) { // If Scoundrel, do this/
		CreateItemOnObject(stringGLOB_10, object1, 1);
		CreateItemOnObject(stringGLOB_11, object1, 1);
		CreateItemOnObject(stringGLOB_12, object1, 1);
	}
	else {
		if ((int1 == 1)) { // If Scout, do this.
			CreateItemOnObject(stringGLOB_7, object1, 1);
			CreateItemOnObject(stringGLOB_8, object1, 1);
			CreateItemOnObject(stringGLOB_9, object1, 1);
		}
		else {
			if ((int1 == 0)) { If Soldier, do this.
				CreateItemOnObject(stringGLOB_4, object1, 1);
				CreateItemOnObject(stringGLOB_5, object1, 1);
				CreateItemOnObject(stringGLOB_6, object1, 1);
			}
		}
	}

	// If you have any points in stealth, add this item.
	if (GetHasSkill(2, GetFirstPC())) {
		CreateItemOnObject(stringGLOB_14, object1, 1);
	}
}

 

 

 

You can either change what the strings mean (they're just before all of the functions in the file) or you can copy and modify these lines if you want to add more items here. After this, you compile and drop in the Override folder. :D

What do those values mean. So if I where to change the Endar Spire box so instead of spawning regular clothes it spawned custom clothing (Like the Custom Class Clothing mod FS made a while ago) unique to each class scoundrel/scout and soldier how could I do that.

Share this post


Link to post
Share on other sites

They are globals, defined in the script that Fair Strides posted:

 

	string stringGLOB_4 = "g_w_blstrrfl001";
	string stringGLOB_5 = "g_i_adrnaline003";
	string stringGLOB_6 = "";

	string stringGLOB_7 = "g_w_blstrpstl001";
	string stringGLOB_8 = "g_i_adrnaline002";
	string stringGLOB_9 = "g_i_implant101";

	string stringGLOB_10 = "g_w_blstrpstl001";
	string stringGLOB_11 = "g_i_secspike01";
	string stringGLOB_12 = "g_i_progspike01";

	string stringGLOB_13 = "end_locker01";
As Fair Strides pointed out, stringGLOB_13 is the starting footlocker. Referring to the globals list, the tag is end_locker01. If you look in the placeables list for end_m01aa_s.rim, you'll see a number of footlocker UTPs. If you check the tags, you'll see the one you want is footlker001.utp. To do what you want, you'd have to delete the clothing item from the footlocker's inventory by editing its UTP, then edit the script Fair Strides posted to spawn the particular items you want for each class. Then you'd need to package it up as a MOD file.

Share this post


Link to post
Share on other sites

There is a slightly alternate form to do this, though it's not often used. It's not used because the normal method is exactly as Darth Parametric described. In addition, it relies on knowing the tag of the footlocker in question (which in this case is "end_locker01") and knowing the order of the spawned objects (if there's more than one object with that tag).

 

In this case though, that is literally the only time that tag is used. So we can do this: remove the basic clothing item from the footlocker and then add whatever we want to it. I'll re-use the sub4 I posted above, but modify it like so:

 

 

 

void sub4() {
	// stringGLOB_13 is the tag of the footlocker object, so the following code grabs that footlocker object.
	object object1 = GetObjectByTag(stringGLOB_13, 0);

	// Get the first object in the footlocker's inventory, and start cycling through the inventory.
	object oInvItem = GetFirstItemInInventory(object1);
	while(GetIsObjectValid(oInvItem)) // While oInvItem is a valid object/item, continue.
	{
		string sTag = GetTag(oInvItem);
		int bDestroy = 0;

		// Let's assume you wanted to remove both the clothes and the short sword.
		if(sTag == "g_a_clothes01")
		(
			bDestroy = 1;
		}
		else if(sTag == "g_w_shortswrd01")
		{
			bDestroy = 1;
		}

		// If bDestroy is 1, then we need to destroy this item.
		if(bDestroy == 1)
		{
			DestroyObject(oInvItem);
			break;
		}

		// And to finish this off and make it loop effectively, change oInvItem to be the next item.
		// This will eventually end the loop, since GetNextObject will return OBJECT_INVALID if there isn't a next item to get.
		oInvItem = GetNextObjectInInventory(object1);
	}

	// Get the PC's starting class.
	int int1 = GetClassByPosition(1, GetFirstPC());
	if ((int1 == 2)) { // If Scoundrel, do this/
		CreateItemOnObject(stringGLOB_10, object1, 1);
		CreateItemOnObject(stringGLOB_11, object1, 1);
		CreateItemOnObject(stringGLOB_12, object1, 1);
	}
	else {
		if ((int1 == 1)) { // If Scout, do this.
			CreateItemOnObject(stringGLOB_7, object1, 1);
			CreateItemOnObject(stringGLOB_8, object1, 1);
			CreateItemOnObject(stringGLOB_9, object1, 1);
		}
		else {
			if ((int1 == 0)) { If Soldier, do this.
				CreateItemOnObject(stringGLOB_4, object1, 1);
				CreateItemOnObject(stringGLOB_5, object1, 1);
				CreateItemOnObject(stringGLOB_6, object1, 1);
			}
		}
	}

	// If you have any points in stealth, add this item.
	if (GetHasSkill(2, GetFirstPC())) {
		CreateItemOnObject(stringGLOB_14, object1, 1);
	}
}

 

 

Share this post


Link to post
Share on other sites

Wow. It's so complicated. I think I understand the GFF files, but scripting is something I will need to work on.

 

I really need a good tutorial to recommend.

Share this post


Link to post
Share on other sites

Wow. It's so complicated. I think I understand the GFF files, but scripting is something I will need to work on.

 

I really need a good tutorial to recommend.

 

I make no promises save what I can get written down throughout the weekend.

Share this post


Link to post
Share on other sites

I've got everything scripted and set up but the KotOR Tool Text Editor is giving me an error when I try to compile. Is there anything I need or am I just doing something wrong?

Share this post


Link to post
Share on other sites

I've got everything scripted and set up but the KotOR Tool Text Editor is giving me an error when I try to compile. Is there anything I need or am I just doing something wrong?

I can't answer that without knowing two things: What is the error message? and What does your script contain? (Can you post the .nss file as an attachment?)

Share this post


Link to post
Share on other sites

Lookup path root set to: C:\Program Files(x86)\Steam\steamapps\common\swkotor\

Loaded nwscript.nss from C:\Program Files(x86)\Steam\steamapps\common\swkotor\override/

Error: Unable to open input file

"C:\Users\Ethan\Documents\Gaming\KotOR Mods\KOTOR\Player, Party, and NPC Items\Player\k_pend_area01.ncs"

 

The last line is the place where I was trying to save the compiled script. Here's the nss file:

k_pend_area01.nss

Share this post


Link to post
Share on other sites

I would guess that the "," in the folder path cause Kotor Tool not to recognize the path. Try another path that doesn't have them (and generally, don't use them in folder names^^).

Share this post


Link to post
Share on other sites

I would guess that the "," in the folder path cause Kotor Tool not to recognize the path. Try another path that doesn't have them (and generally, don't use them in folder names^^).

Nope. I renamed the folder and it's giving me the same error (with the new folder name).

Share this post


Link to post
Share on other sites

There are a few syntax errors in there as far as I can tell.

 

In line 224 you need { instead of ( and in line 238 it has to be GetNextItemInInventory instead of GetNextObjectInInventory I think. I'm not sure but the function in your file does not exist and I assume GetNextItemInInventory is what you want.

 

With those changes I was able to compile it.

Share this post


Link to post
Share on other sites

Still not compiling for me. Could you attach the compiled file here? I'll try and work out why this is broken but for now I'd like to move forward.

Share this post


Link to post
Share on other sites

Hmm. Okay. So the script now deletes the short sword, but the clothing is still there. None of my custom items are. And it's messed up the opening sequence on the Endar Spire. Once the movie finishes you're standing there (no wake up scene) and you have to open the door to let Trask in. Even them you have to initiate the dialogue with him.

 

In other words my items aren't there and it's completely screwed with the opening sequence.

Share this post


Link to post
Share on other sites

I found out why. I had made a mistake in the code that loops through the object's inventory, and apparently the effect is greater than it should have been.

 

In the code where we have DestroyObject(oInvItem), REMOVE the entire line that says "break;". Ironically it broke things. It was supposed to just exit out of the loop, but it apparently cancelled out of everything...

Share this post


Link to post
Share on other sites

Okay so the only thing it changed is that now the short sword is still there. My items still aren't showing and now nothing has been removed.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.