Neverwinter Nights: Enhanced Edition

Neverwinter Nights: Enhanced Edition

Adventures await!
Gather your mods before venturing forth. Discover planes filled with player-created adventures in Steam Workshop, then build your own Neverwinter Nights modules using the Aurora Toolset to share!
Learn More
ICR 22 Mar, 2020 @ 10:39am
Scripting question about loot respawning containers
Hi community!

I'm building a world of my own and have a treasure respawning script I can't get to work. I should say I'm self taught. My scripting knowledge is enough that I can muddle through, but sometimes I miss what is right in front of my face. :)

The script is placed on a treasure on_open. It calls for treasure to be chosen from a container hidden in the area that contains area-specific items inside. It works fine once, but I can't make the thing respawn treasure after a float time of 1600 seconds elapses. I know I'm missing something painfully obvious.

Any help would be appreciated.

Thanks!

//::///////////////////////////////////////////////////
//:: OBJ_TREASURE
//:: OnOpened/OnDeath script for a treasure container.
//:: Treasure type: Local strings (sTreasureType1) (sTreasureType2) (sTreasureType3)
//:: Treasure level: Local string (sTreasureLevel)
//::///////////////////////////////////////////////////

#include "x0_i0_treasure"

int GetBaseType(string sBaseType){
sBaseType = GetStringUpperCase(sBaseType);

if(sBaseType == "ARMOR") return TREASURE_BASE_TYPE_ARMOR;
if(sBaseType == "CLOTHING") return TREASURE_BASE_TYPE_CLOTHING;
if(sBaseType == "WEAPON") return TREASURE_BASE_TYPE_WEAPON;
if(sBaseType == "WEAPON_MELEE") return TREASURE_BASE_TYPE_WEAPON_MELEE;
if(sBaseType == "WEAPON_NOAMMO") return TREASURE_BASE_TYPE_WEAPON_NOAMMO;
if(sBaseType == "WEAPON_RANGED") return TREASURE_BASE_TYPE_WEAPON_RANGED;
return BASE_ITEM_INVALID;
}

void main()
{
float respawntime = 1600.00; //This isn't firing

if (GetLocalInt(OBJECT_SELF,"NW_DO_ONCE") != 0)
return;

string sTreasureLevel = GetStringUpperCase(GetLocalString(OBJECT_SELF, "sTreasureLevel"));
int nTreasureLevel;
if(sTreasureLevel == "HIGH")
nTreasureLevel = TREASURE_TYPE_HIGH;
else if(sTreasureLevel == "MEDIUM" || sTreasureLevel == "MED")
nTreasureLevel = TREASURE_TYPE_MED;
else if(sTreasureLevel == "LOW")
nTreasureLevel = TREASURE_TYPE_LOW;
else if(sTreasureLevel == "UNIQ" || sTreasureLevel == "UNIQUE")
nTreasureLevel = TREASURE_TYPE_UNIQUE;
else{
SendMessageToAllDMs("[Treasure] " + GetName(OBJECT_SELF) + " in " + GetName(GetArea(OBJECT_SELF)) + " has invalid treasure level.");
return;
}

int nBaseType1 = GetBaseType(GetLocalString(OBJECT_SELF, "sTreasureType1"));
int nBaseType2 = GetBaseType(GetLocalString(OBJECT_SELF, "sTreasureType2"));
int nBaseType3 = GetBaseType(GetLocalString(OBJECT_SELF, "sTreasureType3"));

CTG_CreateSpecificBaseTypeTreasure(nTreasureLevel, OBJECT_INVALID, OBJECT_SELF, nBaseType1, nBaseType2, nBaseType3);
SetLocalInt(OBJECT_SELF,"NW_DO_ONCE",1);

AssignCommand( OBJECT_SELF, DelayCommand (respawntime, SetLocalInt(OBJECT_SELF,"NW_DO_ONCE",0) ) );
}
Last edited by ICR; 22 Mar, 2020 @ 10:47am
< >
Showing 1-3 of 3 comments
Izex 1 18 Jun, 2020 @ 8:57pm 
NWN Reddit is more active and you could probably get an answer there. I have asked scripting questions there before and got help there.
wendigo211 3 18 Jun, 2020 @ 9:47pm 
Originally posted by ICR:
//:://///////////////////////////////////////////////// //:: OBJ_TREASURE //:: OnOpened/OnDeath script for a treasure container. //:: Treasure type: Local strings (sTreasureType1) (sTreasureType2) (sTreasureType3) //:: Treasure level: Local string (sTreasureLevel) //:://///////////////////////////////////////////////// #include "x0_i0_treasure" int GetBaseType(string sBaseType){ sBaseType = GetStringUpperCase(sBaseType); if(sBaseType == "ARMOR") return TREASURE_BASE_TYPE_ARMOR; if(sBaseType == "CLOTHING") return TREASURE_BASE_TYPE_CLOTHING; if(sBaseType == "WEAPON") return TREASURE_BASE_TYPE_WEAPON; if(sBaseType == "WEAPON_MELEE") return TREASURE_BASE_TYPE_WEAPON_MELEE; if(sBaseType == "WEAPON_NOAMMO") return TREASURE_BASE_TYPE_WEAPON_NOAMMO; if(sBaseType == "WEAPON_RANGED") return TREASURE_BASE_TYPE_WEAPON_RANGED; return BASE_ITEM_INVALID; } void main() { float respawntime = 1600.00; //This isn't firing if (GetLocalInt(OBJECT_SELF,"NW_DO_ONCE") != 0) return; string sTreasureLevel = GetStringUpperCase(GetLocalString(OBJECT_SELF, "sTreasureLevel")); int nTreasureLevel; if(sTreasureLevel == "HIGH") nTreasureLevel = TREASURE_TYPE_HIGH; else if(sTreasureLevel == "MEDIUM" || sTreasureLevel == "MED") nTreasureLevel = TREASURE_TYPE_MED; else if(sTreasureLevel == "LOW") nTreasureLevel = TREASURE_TYPE_LOW; else if(sTreasureLevel == "UNIQ" || sTreasureLevel == "UNIQUE") nTreasureLevel = TREASURE_TYPE_UNIQUE; else{ SendMessageToAllDMs("[Treasure] " + GetName(OBJECT_SELF) + " in " + GetName(GetArea(OBJECT_SELF)) + " has invalid treasure level."); return; } int nBaseType1 = GetBaseType(GetLocalString(OBJECT_SELF, "sTreasureType1")); int nBaseType2 = GetBaseType(GetLocalString(OBJECT_SELF, "sTreasureType2")); int nBaseType3 = GetBaseType(GetLocalString(OBJECT_SELF, "sTreasureType3")); CTG_CreateSpecificBaseTypeTreasure(nTreasureLevel, OBJECT_INVALID, OBJECT_SELF, nBaseType1, nBaseType2, nBaseType3); SetLocalInt(OBJECT_SELF,"NW_DO_ONCE",1); AssignCommand( OBJECT_SELF, DelayCommand(respawntime, SetLocalInt(OBJECT_SELF,"NW_DO_ONCE",0) ) ); }

You had a space after DelayCommand, see if this fixes things. If that doesn't work, try a short delay like under 6s and see if that works, there could be something giving a ClearAllActions call to your object.
Last edited by wendigo211; 18 Jun, 2020 @ 9:47pm
ICR 19 Jun, 2020 @ 12:01pm 
A space. It's amazing how something so small could break my brain. Thanks for the help!
< >
Showing 1-3 of 3 comments
Per page: 1530 50