When spawning an object of any kind, it is important to take re-entry into consideration. Most of the time, you only want to spawn something once, so you have to come up with a way of determining ahead of time whether you've already spawned something or not.
1. Check for the presence of the spawned object.
Seems pretty straightforward right? If the object exists, don't spawn another one. This method works well for
placeables and spawned items that go into a spawned placeable.
An example of the code would look like this:
Code:
void main() {
object oContainer=GetObjectByTag("spawned_container_tag");
if (oContainer==OBJECT_INVALID) {
vector vContainer=Vector (0.0, 0.0, 0.0);
location lContainer=Location(vContainer, 0.0);
oContainer= CreateObject(OBJECT_TYPE_PLACEABLE, "container_template", lContainer);
CreateItemOnObject("item_template", oContainer);
}
}
2. Set a Local Boolean
This method is good for
items that are being spawned into a pre-existing container. The idea is that we're going to put an invisible flag upon the container when we spawn the items for the first time. Then if our script fires again, it will first check for the existence of that flag and, if present, abort. If you firing your spawn script from a dialog, you could also use the presence of the boolean flag in a Conditional Script to prevent the dialog branch from being available.
Note: In general, it is best to write only to Local variables of objects, not creatures since they use them for walking waypoints and other AI. Unless you've researched the AI scripts and know which ones are safe to use, stick to object or use Global variables.
Example:
Code:
void main()
{
//Conditional Spawn NPC Script By TK102, Darth333, and RedHawke
int nBoolSlot=6; //any number 0-7 can be used here
object oLocker=GetObjectByTag("footlker099"); // get a reference to the pre-existing container
int nCheck=GetLocalBoolean(oLocker ,nBoolSlot);
if (nCheck) { return; } //exit if TRUE
CreateItemOnObject("g_w_lghtsbr05", oLocker);
CreateItemOnObject("g_a_mstrrobe01", oLocker);
CreateItemOnObject("g_w_sbrcrstl04", oLocker, 2);
// now close the door so we can't re-enter
SetLocalBoolean(oLocker,nBoolSlot,TRUE);
}
3. Set a Global Boolean
This method is suitable for
creatures. Instead of writing a value locally to an object, we will write it to the memory of the game itself. To do this we will need to use a boolean variable that is defined in
globalcat.2da. If you think you can find an obsolete Global Boolean that is already defined (like one from the Endar Spire) you can use that. Otherwise you'll have to edit globalcat.2da, add your new boolean, and put it in your override (and distribute it with your mod).
Example:
Code:
void main()
{
int nCreatureSpawned = GetGlobalBoolean("my_global_bool");
if (nCreatureSpawned) { return; } //exit if TRUE
CreateObject( OBJECT_TYPE_CREATURE, "creature_template", GetLocation(GetFirstPC()) );
// now close the door so we can't re-enter
SetGlobalBoolean("my_global_bool",TRUE);
}