CreateObject(int, string, location, int, string)
Create an object of a specified type at a given location
object CreateObject( int nObjectType, string sTemplate, location lLocation, int bUseAppearAnimation = FALSE, string sNewTag = "" );
Parameters
nObjectType
nObjectType: OBJECT_TYPE_ITEM, OBJECT_TYPE_CREATURE, OBJECT_TYPE_PLACEABLE, OBJECT_TYPE_STORE, OBJECT_TYPE_WAYPOINT
sTemplate
The resref of the object to create from the pallet
lLocation
The location to create the object at
bUseAppearAnimation
If TRUE, it will play EffectAppear() when created - the creatures appear animation will play (Default: FALSE)
sNewTag
If this string is not empty, it will replace the default tag from the template (Default: "")
Description
This function allows the creation of specific objects at any location within a module.
Using this function it is possible to spawn items, creatures, placeables and stores on the occurance of certain events.
In older patches, providing an invalid sTemplate, a badger would be created when trying to make a creature, and a Miscellaneous Small item when trying to make an item. Confirmed as of patch 1.30, this is no longer the case - an invalid sTemplate will simply not create anything!
Note that you can't use DelayCommand with this function, since DelayCommand only works with void returning functions, and CreateObject returns the created object. Instead, you must create a wrapper function and delay that. BioWare has already provided us with such a wrapper function in an include file: it is called CreateObjectVoid.
Remarks
Only the following constants are valid for the nObjectType parameter:
- OBJECT_TYPE_ITEM
- OBJECT_TYPE_CREATURE
- OBJECT_TYPE_PLACEABLE
- OBJECT_TYPE_STORE
- OBJECT_TYPE_WAYPOINT (as of patch 1.30)
If sNewTag is specified (other than the default ""), the created object will be given that new tag.
Be careful with 'sTemplate', or you may find yourself with a lot more Badgers than you want. A ResRef is a unique key into the palette of objects that comes with the engine and your module. If you attempt to look up the ResRef of a standard placeable or creature, it's natural to right-click the object in the palette and look for a 'Properties' option to examine. It isn't there, and the next-best-thing is very tempting - 'Edit Copy'. Sure enough, 'Edit Copy' gives you the appropriate object properties dialogue, and there's a blueprint ResRef, for example "SKELETON001".
Unfortunately, the Toolset has done what it said it would - shown you a copy of the blueprint, not a copy of an object created using blueprint, as you might expect. So your ResRef is in fact a toolset-generated reference string for a new blueprint - one which promptly disappears when you cancel the properties screen to go back to the Script Editor. To make matters that little bit more confusing, by default the Tag of an object created from a standard blueprint is the same as the blueprint ResRef, which might lead you to mistake a Tag for a ResRef.
The easiest way to find the ResRef for a resource is to click on the "View" menu and select the "Show Preview Window" menu item. This will cause a preview window to appear which details not only the ResRef, but the Name, Tag, and Comments for a particular resource (when available). You can view properties by clicking on an already existing object or choosing an object from the various palettes within the toolset.
Known Bugs
As of patch 1.30, bUseAppearAnimation finally works, though there’s been reports that some of the appear animations are a little weird.
According to Bioware, there was a problem creating waypoints with mappins. This is not mentioned in the release notes for patch 1.31. The problem still persists in 1.61.
Creating a creature during the OnEnter event without first checking to see what's actually entering the area causes NWN to enter an infinite loop of creating creatures (as each creature created causes the OnEnter event to fire its attached script again). This can be avoided by testing if GetIsPC(GetEnteringObject()) is true (if its true, then create the creature(s); if its false then a creature that was created fired the event).
Version
1.62
Example
// The following script will create a chicken next to waypoint. // The waypoint used is tagged "CHICKEN_WAYPOINT". // The deadly chicken is from the standard pallet. There are lists // of creatures Res Refs for standard pallet creatures in the lexicons // lists, with explanations of what they spawn. // Note that this deadly chicken shouldn't be created from an area's // On Enter event, unless there are checks making sure that no // more then one deadly chicken can be created. void main() { // Object type to create int nObjectType = OBJECT_TYPE_CREATURE; // What to create - a "standard" chicken (noting its deadly 1d2 // damage attack - not what I'd call standard, eh? more like // death incarnate for those who annoy it...) string sChicken = "nw_chicken"; // Where to make the chicken appear location lTarget = GetLocation(GetWaypointByTag("CHICKEN_POINT")); // We do want appear animation // - flying down to our chicken point! int bUseAppearAnimation = TRUE; // Actually create the object. Note the example below will // actually use the object later on, not just call it. CreateObject(nObjectType, sChicken, lTarget, bUseAppearAnimation); } // Example 2 will take similar parameters to the above (using // some more directly into the function), but once // the chicken has appeared, it will make it super chicken, // by making it god - giving it the power of Plot Mode (TM) // (Plot mode is a trade mark of the Bioware God and Godess // society, Canada) void main() { // It might look the same chicken... string sChicken = "nw_chicken"; // ...which will appear at the same place... location lTarget = GetLocation(GetWaypointByTag("CHICKEN_POINT")); // ...and be created the same way... // (Note: we now use a declared object to capture the new // created chicken) object oChicken = CreateObject(OBJECT_TYPE_CREATURE, sChicken, lTarget, TRUE); // ...but we make it Super Chicken now we created it! SetPlotFlag(oChicken, TRUE); } // Example 3. // We create an object using a delayed function. // * You can also see CreateObjectVoid() for this function's use. // Note that this: /* void main() { // Chicken again. string sChicken = "nw_chicken"; // Chicken point. location lTarget = GetLocation(GetWaypointByTag("CHICKEN_POINT")); // Will not work - DelayCommand() requires a "void" function. DelayCommand(50.0, CreateObject(OBJECT_TYPE_CREATURE, sChicken, lTarget, TRUE)); } */ // ...Will not work, as DelayCommand() will only work if the // function has "void" or "action" in front of it, for example, // ApplyEffectToObject() will work, it has been declared by Bioware // as "void ApplyEffectToObject(int nDurationType, effect eEffect, object oTarget, float fDuration=0.0f)" // So therefore, we use this void function to delay the creation // of our chicken; we won't make him god this time however. void CreateObjectVoid(int nObjectType, string sTemplate, location lLoc, int bUseAppearAnimation = FALSE) { CreateObject(nObjectType, sTemplate, lLoc, bUseAppearAnimation); } void main() { // Chicken again. string sChicken = "nw_chicken"; // Chicken point. location lTarget = GetLocation(GetWaypointByTag("CHICKEN_POINT")); // Will work - we use new void declared function. DelayCommand(50.0, CreateObjectVoid(OBJECT_TYPE_CREATURE, sChicken, lTarget, TRUE)); }
See Also
functions: | ActionCreate | CopyObject | CreateObjectVoid |
categories: | Item Creation Functions |
constants: | OBJECT_TYPE_* Constants |
author: Dave Withnall, editor: Jasperre, additional contributor(s): Jit Fong Oon, Jazael, Stephen Fritz, Jasperre, Lilac Soul