Nwn2fixes


#82

eg. This is the sort of shenanigans going on for a (simple) RecruitTroops deployment

oc2100_RecruitTroops_debug


#83

and this might be an okay workaround for the SpecialMissions bug (ie, it prevents re-assigning the greycloaks during a 2TU SpecialMission [note: there are no missions/deployments that take longer than 2TU], thereby disallowing the player from unwittingly breaking SpecialMission progression)

but, and this is the reason I don’t call it a “fix” – player can no longer assign, then change his/her mind and re-assign the greycloaks, unless PC leaves and re-enters the Keep interior … ( plus there could be other things that it breaks or pseudo-breaks – or state for which it just doesn’t work )


#84

I am making alot of savegames before going to a new module. I can put my findings here.


#85

OK I found something.

Neeskha and Leldon quest line;

achieve the stealth completion[disable all the noise traps] and suppose to meet him in the park in merchant area. quest remains unfinished since the park encounter does not trigger[walked the whole park]. Rob the collectors quest triggers normally, can be finished.

Castle Never - minor graphic bug;

Double main doors, open one and the other is still up[great security?], can transition areas normally.


#86

SOZ module N_X2
n00_nevalle.dlg
When you purchase the Trading Post from Nevalle, he doesn’t actually take the 800 trade bars from you.
Needs a ka_take_bars(800) added to the appropriate node.


#87

Ballard’s dialog after finding the blast barrels, before sending Tarvoick up.

I blew up both barrels by prying[dialog option probly lacks action to change check condition], yet the option to assign them to the doors is still valid.

Check condition is missing or wrongly checked.


#88

Found some bugs in the SoZ’s nx2_crafting.2da…


#89

SoZ had all the quality assurance of an armadillo drifting across the Pacific on a raft.

on a sidenote, if anyone is really interested in a fixed SoZ crafting system, try Kaldor’s SoZ Crafting Plus System


#90

I just thought about the hollows in Neverwinter A1 module, theres alot of scripts still in there, can any be of use in crossroad?


#91

i think they’re obsolete – completely replaced by the 2100 scripts.


#92

It would be a little harder to get the stronghold started, since kana and ucus have to be picked up. I thought maybe some of the hollows things can be taken in, if they are not too buggy.


#93

I haven’t purposely examined the hollows but my understanding is that everything that was in the hollows made it into the Keep. that is, am guessing that the Keep started with the hollows as a base and extended it (leaving behind a whack of unused hollows’ scripts).


#94

Can you tell me where I can get something that can read md files. My computer can’t read these. Which makes the readme file useless to me. I like what you and the others have done. Thanks Greenman


#95

md stands for MarkDown, which is a very simplified html MarkUp

If you open it in a texteditor it makes sense, or just look at the frontpage for Nwn2Fixes @ github:

the README.md file is displayed (automatically as markdown) – that’s the only reason why there’s a .MD file … just to display a bit of text there.


#96

Tarmas house quest - even when you finish raiding his house, you still have the quest uncompleted in the journal.

Probly needs a script? to check the 3 places lootable - desk, chest, amoire.


#97

I’ve heard about this bug. This quest is supposed to be removed from the journal once you visit Tarmas’ house, but sometimes it doesn’t happen.

This is the OnClientEnter script for his house.

// 11_a_tarmas_center
/*
	All this does is remove the Wizard's Arsenal quest.
*/
// JYL 07/20/06

int StartingConditional()
{
	RemoveJournalQuestEntry("11_tarmas_house",GetFirstPC(), TRUE, TRUE);

	if (GetGlobalInt("11_west_harbor_plot")>=10)
	{
		object oArea = GetObjectByTag("1102_tarmas");
		AmbientSoundChangeDay(oArea, 0);	//turn off ambient sounds
		AmbientSoundChangeNight(oArea, 0);
		MusicBackgroundChangeDay(oArea,95);	//set to West Harbor Theme
		MusicBackgroundChangeNight(oArea,95);
	}

	return FALSE;
}

#98

Ok, I just checked it in-game. I don’t think there’re any bugs with this quest. The problem here is that the player can visit and loot Tarmas’ house before even talking to him and he has to visit his home again in order to remove this quest from his journal. It’s probably a good idea to set a new variable in the OnClientEnter script and than check this variable in the convo with Tarmas.


#99

Great, can add it to github?

================
Another bug found is the archives;

After answering all the questions, sometimes the cutscene the main vault does not trigger. I think its caused by companions running past the front door, the opening door that is shown in the cutscene. But I cannot really reproduce this error consistently, sometimes companions running by dont affect it and it works normally.

If the cutscene does not trigger, you can walk it to chat with all the gith, not that they can say a word… but you can still access the record and teleport to shandra’s farm.

==============

Leldon’s house - the noise trap script needs check condition changed. Companions do not trigger the traps, and you can just let them run riot while disabling the traps, this is rather breaking the whole point of being stealthy… even neeshka can run over the traps without setting them off… its rather funny to think the brawling khelgar can also run over the traps…


#100

ginc_item.nss:

// store info on item about current owner and slot equipped
void RememberEquippedItem(object oOwner, int iSlot)
{
	object oInventoryItem = GetItemInSlot(iSlot, oOwner);
	if (oInventoryItem != OBJECT_INVALID)
	{
		SetLocalInt(oInventoryItem, LAST_SLOT_NUM, iSlot);
		SetLocalObject(oInventoryItem, LAST_SLOT_OBJ, oOwner);
	}
}
// restore item to slot last remembered
void RestoreEquippedItem(object oOwner, object oInventoryItem, int bReset=TRUE)
{
	int iSlot = GetLocalInt(oInventoryItem, LAST_SLOT_NUM);
	//object oOrigOwner = GetLocalObject(oInventoryItem, LAST_SLOT_OBJ);

	if (iSlot > 0)
	{
		AssignCommand(oOwner, ActionEquipItem(oInventoryItem, iSlot));
		if (bReset)
		{
			DeleteLocalInt(oInventoryItem, LAST_SLOT_NUM);
			DeleteLocalObject(oInventoryItem, LAST_SLOT_OBJ);
		}
	}
}
// Restore all inventory items to equipment slot last remembered (if any)
void RestoreEquippedItems(object oOwner, int bReset=TRUE)
{
	object oInventoryItem = GetFirstItemInInventory(oOwner);
	object oLeftHandItem;
	int iSlot;

	while (oInventoryItem != OBJECT_INVALID)
	{
		iSlot = GetLocalInt(oInventoryItem, LAST_SLOT_NUM);

		//EPF 8/29/06 left hand must be equipped after right.  Otherwise the engine
		//    will shift it to the right hand slot automatically.
		if(iSlot != INVENTORY_SLOT_LEFTHAND)
		{
			RestoreEquippedItem(oOwner, oInventoryItem, bReset);
			oInventoryItem = GetNextItemInInventory(oOwner);
		}
		else
		{
			oLeftHandItem = oInventoryItem;
		}
	}

	if(GetIsObjectValid(oLeftHandItem))
	{
		RestoreEquippedItem(oOwner, oLeftHandItem, bReset);
	}
}

What bothers me here is the line iSlot = GetLocalInt(oInventoryItem, LAST_SLOT_NUM); in the last function.
Since INVENTORY_SLOT_HEAD = 0, it will try to equip in the head slot any item that doesn’t have this local variable set on it. A possible fix: add +1 to the value of the LAST_SLOT_NUM variable and substract it later.


#101

Another thing here that confuses me:

		//EPF 8/29/06 left hand must be equipped after right.  Otherwise the engine
		//    will shift it to the right hand slot automatically.
		if(iSlot != INVENTORY_SLOT_LEFTHAND)
		{
			RestoreEquippedItem(oOwner, oInventoryItem, bReset);
			oInventoryItem = GetNextItemInInventory(oOwner);
		}
		else
		{
			oLeftHandItem = oInventoryItem;
		}

Shouldn’t this be replaced with

		//EPF 8/29/06 left hand must be equipped after right.  Otherwise the engine
		//    will shift it to the right hand slot automatically.
		if(iSlot != INVENTORY_SLOT_LEFTHAND)
		{
			RestoreEquippedItem(oOwner, oInventoryItem, bReset);
		}
		else
		{
			oLeftHandItem = oInventoryItem;
		}

		oInventoryItem = GetNextItemInInventory(oOwner);

?