545 lines
22 KiB
Plaintext
545 lines
22 KiB
Plaintext
//
|
|
//
|
|
// NESS
|
|
// Version 8.1.3
|
|
// Spawn History
|
|
//
|
|
//
|
|
// Neshke Narovken (Original Author)
|
|
//
|
|
// Cereborn (Maintainer)
|
|
//
|
|
//*******************************************************************
|
|
//
|
|
// History:
|
|
//
|
|
// +++ Start Version 7.0
|
|
//
|
|
// --/--/-- Neshke Created
|
|
//
|
|
//
|
|
// +++ Start Version 7.0.1
|
|
//
|
|
// 12/03/02 Cereborn Added DanielleB's merchant-based loot tables
|
|
// 12/12/02 Cereborn Added area-wide count of currently spawned
|
|
// creatures
|
|
// 12/31/02 Cereborn Added LT subflags A, B, and C for specifying
|
|
// percentage chances of receiving 1, 2, or 3
|
|
// loot items.
|
|
// 01/01/03 Cereborn Added SX flag for dim returns suppression.
|
|
//
|
|
// +++ Start Version 7.0.2
|
|
//
|
|
// 01/07/03 Cereborn Added NESS_ActivateSpawn(),
|
|
// NESS_DeactivateSpawn, NESS_GetSpawnByID(),
|
|
// NESS_ActivateSpawnByID(), NESS_ForceProcess()
|
|
// NESS_DeactivateSpawnByID() and
|
|
// NESS_TrackModuleSpawns().
|
|
// Modified so that an activated spawn is processed
|
|
// immediately instead of waiting for the next
|
|
// process tick when using SPxx
|
|
// Moved ReportSpawns and TrackModuleSpawns
|
|
// to spawn_functions from spawn_main; modified
|
|
// spawn_main to call TrackModuleSpawns() if
|
|
// enabled, removing the need for placing
|
|
// in each area heartbeat script
|
|
//
|
|
// 01/08/03 Cereborn Fixed bug preventing initial flag processing
|
|
// when using SPxx.
|
|
// Added new deactivate spawn (DS) condition
|
|
// (6) which deactivates a spawn whenever spawn
|
|
// count reaches spawn number. This is similar
|
|
// to DS1, except that DS1 is based on number
|
|
// of children *ever* spawned, so once
|
|
// deactivated can never be reactivated, while
|
|
// DS6 is based on current child count, allowing
|
|
// the spawn to be re-activated if 1 or more of
|
|
// it's children have been killed or despawned
|
|
// 01/10/03 Cereborn Prevent despawning creatures when possessed
|
|
// by a DM. (the code was attempting to do so
|
|
// already but due to a Bioware bug it wasn't
|
|
// working)
|
|
// 01/11/03 Cereborn Added I subflag to SU to check each child's
|
|
// location individually instead of the spawn's
|
|
// location
|
|
// 01/17/03 Cereborn Added force process of spawns when PCs
|
|
// re-arrive id deactivated by PC flag
|
|
// 01/18/03 Cereborn Added new type (3) to PL and subflag P
|
|
// Added P subflag to SD.
|
|
// 01/20/03 Cereborn Force process on deactivate
|
|
// Added NESS_IsModuleSpawnTracking()
|
|
//
|
|
// +++ Start Version 7.0.3
|
|
//
|
|
// 01/22/03 Cereborn Bug fix: Initialize module spawn count to
|
|
// 0 to fix bug with loading from saved games
|
|
// 01/24/03 Cereborn Added NESS_DumpModuleSpawns() and
|
|
// NESS_IsModuleSpawnDumping(). When spawn
|
|
// dumping is enabled, each area with active
|
|
// spawns reports its spawn count each HB
|
|
//
|
|
//
|
|
// +++ Start Version ALFA 1.0
|
|
//
|
|
//
|
|
// 02/05/03 - 03/21/03
|
|
//
|
|
// Added NESS_ProcessDeadCreature(). This can be used to notify NESS that
|
|
// a spawned creature has died (typically from an onDeath event script).
|
|
// This is particularly useful when using larger SPxx values and the CD
|
|
// flag, since without notification it can take a long time for NESS to
|
|
// discover that the spawned creature has died and set up the lootable
|
|
// corpse.
|
|
//
|
|
// Added O(ffset) subflag to the SP flag. NESS now processes all spawns on
|
|
// the first heartbeat, and then spawns are be processed on heartbeat
|
|
// 1 + offset + (processRate * N). For example, SP3 gets processed on
|
|
// heartbeats 1, 4, 7, 10, etc.... while SP3O1 gets processed on heartbeats
|
|
// 1, 5, 8, 11..., and so on. This should be used to spread out heartbeats
|
|
// within an area.
|
|
//
|
|
// NESS no longer does any timing based on counted heartbeats. All timings
|
|
// are now based on the clock. A new file, spawn_timefuncs, contains
|
|
// functions for converting the game clock to real seconds for use in NESS
|
|
// timings.
|
|
//
|
|
// When spawns despawn due to using the PC flag (and if the R subflag is
|
|
// not specified) the despawning creature resrefs and their locations are
|
|
// recorded, and the spawn is restored to it previous state when PCs
|
|
// re-enter the area. This prevents exploits where players intentionally
|
|
// 'pop' a zone, then leave for the PC flag's duration, to effectively
|
|
// clear an area of all obstacles until the spawn delay timer (if any)
|
|
// expires.
|
|
//
|
|
// Fixed the bug causing corpses that had been fully looted to not decay.
|
|
//
|
|
// Fixed the bug that caused corpses to *never* decay if the decay timer
|
|
// went off when the inventory was open (now a new decay timer is set).
|
|
//
|
|
// Flag parsing code cleaned up; fixed a bug that caused the default value
|
|
// for a flag to always be 1 (ignoring what was set up in spawn_cfg_global)
|
|
//
|
|
// Items marked no-drop are no longer copied onto the lootable corpses
|
|
//
|
|
// All no-drop items are explicitly destroyed (whether the CD flag is used
|
|
// or not) to working around a current Bioware memory leak.
|
|
//
|
|
// Added NESS_ReturnHome(). Call to force a NESS spawn to it's home point.
|
|
//
|
|
// Added support for RH flag on spawn camps.
|
|
//
|
|
// +++ Start Version ALFA 1.0 Patch 1 (v1.0.1)
|
|
//
|
|
// 03/29/03
|
|
//
|
|
// A bug where spawn delays were being applied to first time spawns that
|
|
// didn't happen right away (such as triggered spawns, day/night only,
|
|
// etc.) was fixed.
|
|
//
|
|
// If a spawn has the RH flag and is respawned after being despawned due
|
|
// to the PC flag, creatures will respawn at their home point instead of
|
|
// where they were when they despawned.
|
|
//
|
|
// An errant debug statement was removed.
|
|
//
|
|
// +++ Start Version ALFA 1.0 Patch 2 (v1.0.2)
|
|
//
|
|
// 03/30/03
|
|
//
|
|
// Fixed a bug where the number of creatures in a spawn was getting
|
|
// confused due to spawns that use the M subflag of the SN flag
|
|
// recalculating their spawn numbers when spawns deactivated due to the
|
|
// PC flag. This bug fix should eliminate the overpopulating spawns
|
|
// problem.
|
|
//
|
|
// +++ Start Version ALFA 1.0 Patch 3 (v1.0.3)
|
|
//
|
|
// 03/31/03
|
|
//
|
|
// Fixed a bug where spawn delays could be skipped.
|
|
//
|
|
// +++ Start Version ALFA 1.0 Patch 4 (v1.0.4)
|
|
//
|
|
// 04/04/03
|
|
//
|
|
// Fixed a bug where spawn delays were ignored on placeables.
|
|
// Fixed P subflag of SD being ignored.
|
|
// Reset spawn delay after RS-failed spawn attempt
|
|
// Set up a new spawn delay when creature killed
|
|
//
|
|
// +++ Start Version ALFA 1.0 Patch 5 (v1.0.5)
|
|
//
|
|
// 04/07/03
|
|
//
|
|
// Fixed bug in spawn_timefuncs that resulting in incorrect conversions
|
|
// in years other than the Epoch year.
|
|
// Changed the Epoch year to 1340 to conform to the lowest date in
|
|
// the NWN engine.
|
|
//
|
|
// +++ Start Version ALFA 1.0 Patch 6 (v1.0.6)
|
|
//
|
|
// 04/08/03
|
|
//
|
|
// Fixed bug with corpse decay and death script flags not being available
|
|
// for camp spawns when onDeath notification occurs.
|
|
//
|
|
// +++ Start Version ALFA 1.0 Patch 7 (v1.0.7)
|
|
//
|
|
// 04/27/03
|
|
//
|
|
// Added debugging for spawn delays and spawn counts that can be
|
|
// independently enabled/disabled for each area from the spawn banner
|
|
// rod.
|
|
//
|
|
// +++ Start Version ALFA 1.1 (v1.1)
|
|
//
|
|
// 04/28/03
|
|
//
|
|
// Fixed bug in Loot Merchant code. The original code used
|
|
// GetNearestObjectByTag() to look up loot merchants, which according to
|
|
// the documentation should never have worked for merchants not in the same
|
|
// area as the creature spawned. In reality, it stopped working (at least
|
|
// in some cases) after Bioware released version 1.29 of the game.
|
|
//
|
|
// 05/03/03
|
|
//
|
|
// Changed distribution method used for SR flag to evenly distribute
|
|
// spawns in the spawn circle instead. The old method made the spawns
|
|
// denser near the center and rarer near the circle's edge
|
|
//
|
|
// Made SF work (again?) for placeables
|
|
//
|
|
// When the SF flag is not specified for a multi-child spawn, a random
|
|
// SF is now calcualated independently for each child
|
|
//
|
|
// 05/08/03
|
|
//
|
|
// Added NL (No Loot) flag. This suppresses looting of player corpses.
|
|
// Only applies when using ACR 1.14 and higher
|
|
//
|
|
// 05/25/03
|
|
//
|
|
// Fixed overspawning bug caused by changing child counts on spawns that
|
|
// had been 'saved' with potentially different counts
|
|
//
|
|
// 05/27/03
|
|
//
|
|
// Added C (Closest) subflag to the PR (Patrol Route) flag. If C is
|
|
// specified, the spawned creature will start at the closest waypoint
|
|
// rather than the first (does not apply to T2 flagged routes(random
|
|
// traverse)).
|
|
//
|
|
// 05/30/03
|
|
//
|
|
// Added SB (Subdual) flag. Causes creatures to be spawned in in subdual
|
|
// mode. Only applies when using ACR 1.14 and higher.
|
|
//
|
|
//
|
|
// +++ Start Version ALFA 1.2 (v1.2)
|
|
//
|
|
// 08/24/03
|
|
//
|
|
// Removed LocationToString() function from spawn_functions, as this is
|
|
// now a Bioware function
|
|
//
|
|
// 08/25/03
|
|
//
|
|
// Modified the way the SX flag works. First, there is now a global flag,
|
|
// nGlobalSuppressDR, in spawn_cfg_global that can be set to determine
|
|
// whether or not creatures spawn in with DR on or off when no SX flag is
|
|
// specified. The current default is for DR to *not* be suppressed, i.e.,
|
|
// it will be operational. Also, the SX flag can now take a value of 0 or 1.
|
|
// If 1, DR is suppressed, if 0 DR is enabled (useful if you've set
|
|
// nGlobalSuppressDR to 1). The default if no value is specified (just SX)
|
|
// is 1 (to suppress). You can also change this default in spawn_cfg_global.
|
|
// If nGlobalSuppressDR is 1 and nSuppressDR is 0, you will get the opposite
|
|
// of the v1.1 functionality; no DR on creatures, except when the SX flag is
|
|
// present.
|
|
//
|
|
// +++ Start Version ALFA 1.2.1 (v1.2.1)
|
|
//
|
|
// 09/01/03
|
|
//
|
|
// Fixed bug where spawn number was always being set to the number of saved
|
|
// camp spawns on PC-flag restore instead of the sum of saved camp and
|
|
// regular spawn counts.
|
|
//
|
|
// +++ Start Version ALFA 1.2.2 (v1.2.2)
|
|
//
|
|
// 09/02/03
|
|
//
|
|
// Fixed bug introduced by last bug fix that caused overspawning!
|
|
//
|
|
// +++ Start Version ALFA 1.2.3 (v1.2.3)
|
|
//
|
|
// 09/21/03
|
|
//
|
|
// Added EL - E(ncounter) L(evel) flag
|
|
//
|
|
// +++ Start Version ALFA 1.2.4 (v1.2.4)
|
|
//
|
|
// 10/03/03
|
|
//
|
|
// Added I subflag to SL flag.
|
|
//
|
|
// Modified ST behavior so that spawned creatures walk to their seats
|
|
// instead of running
|
|
//
|
|
// 10/18/03
|
|
//
|
|
// Check night / day only, day, hour, lifespan and SU before restoring
|
|
// spawns
|
|
//
|
|
// Fixed recalculate random spawn number bug where the spawn number could
|
|
// change before a despawn due to the PC flag was restored, causing the
|
|
// number of creatures thought to exist to differ from what actually got
|
|
// restored
|
|
//
|
|
// 10/19/03
|
|
//
|
|
// Fixed SD bug; under certain cases (such as a despawn due to CL flag)
|
|
// SD was being ignored.
|
|
//
|
|
// Fixed bug where SU|I only worked if RS or SL were in use
|
|
//
|
|
// +++ Start Version ALFA 1.2.5 (v1.2.5)
|
|
//
|
|
// 10/25/03
|
|
//
|
|
// Do a ClearAllActions() before despawning creatures. This helps prevent
|
|
// 'broken' Bioware chairs caused by despawning creatures using the ST
|
|
// flag.
|
|
//
|
|
// 10/27/03
|
|
|
|
// Modified the spawn_cfg_camp example to use standard BW creatures /
|
|
// placeables for the benefit of non-ALFA users.
|
|
//
|
|
//
|
|
// 11/02/03
|
|
//
|
|
// Added a scaled encounter example. This uses the same basic methodology
|
|
// as Sareena's random wilderness spawns - an SNxx flag is given large
|
|
// enough for the largest possible spawn and then the actual number (and
|
|
// types) of creatures is determined when the spawn actually takes place.
|
|
//
|
|
//
|
|
// +++ Start Version 8.0
|
|
//
|
|
// Given that NESS is now being supported outside the ALFA umbrella, I've
|
|
// decided to begin version numbering from 8.0 from here out. Version 8.0
|
|
// is the immediate successor to ALFA version 1.2.5.
|
|
//
|
|
// 01/19/04
|
|
//
|
|
// Fixed problems with naked NPC corpses that had droppable armor /
|
|
// clothing. playable race characters (humans, dwarves, elves, etc.)
|
|
// now keep a copy of whatever is in the chest slot on the original
|
|
// corpse.
|
|
//
|
|
//
|
|
// 01/21/04
|
|
//
|
|
// Added Rn subflag to CD to specify what type of remains are left after
|
|
// corpse decay. These correspond 1 to 1 to the treasure type field for
|
|
// placeables, except for R7, which causes no loot bag to be left (loot
|
|
// destroyed when corpse decays). See the specific flag documentation
|
|
// below for the values/types of each R subflag.
|
|
//
|
|
// Added D subflag to CD to cause corpse to drop wielded weapons on the
|
|
// ground. Note that droppable flag on weapon still takes precedence -
|
|
// non-droppable wielded weapons will not be dropped.
|
|
//
|
|
// Delete armor/clothing from corpse if looted.
|
|
//
|
|
// Added scripts for lootable corpse onOpen, onClosed, onUsed, and
|
|
// onDisturbed events (renamed with a spawn_ prefix).
|
|
//
|
|
// Added a lootable corpse placeable for each remains type; each has the
|
|
// correct event scripts attached.
|
|
//
|
|
// 01/22/04
|
|
//
|
|
// Initialize global defaults and flags on first area heartbeat, not first
|
|
// heartbeat with PCs present.
|
|
//
|
|
// Use DelayCommand(0.0, ...) to give each spawn flag initialization
|
|
// function its own command queue (allowing many more spawn points before
|
|
// TMIs at initialization occur).
|
|
//
|
|
// 01/23/04
|
|
//
|
|
// Fixed bug with EE flag. Spawned creature was not walking to spawn point
|
|
// after entrance.
|
|
//
|
|
// Fixed bug with spawn in effect when using EE. Spawn in effect now happens
|
|
// at the entrance point.
|
|
//
|
|
// Added support for ALFA-specific flags as Custom Flags (following the CF
|
|
// flag. Parsing and processing of custom flags can now be done by
|
|
// modifying spawn_cfg_cusflg. This file contains 2 functions:
|
|
// ParseCustomFlags() and SetupCustomFlags(). ParseCustomFlags is called
|
|
// with whatever flags follow the CF_ flag (when flags for the spawn are
|
|
// being initialized. Typically, flags are parsed and there values are
|
|
// written to the spawn object. SetupCustomFlags() is called when a
|
|
// creature is actually spawned (typically flags are copied from the spawn
|
|
// object to the creature (spawned) object. The processing of ALFA-specific
|
|
// flags are included in this file as an example.
|
|
//
|
|
//
|
|
// +++ Start Version 8.1
|
|
//
|
|
// 1/29/04
|
|
//
|
|
// Put better sounds for closing / opening corpses. Changed the names of
|
|
// the onOpen and onClose event scripts for corpses, and updated the corpse
|
|
// placeables to use those.
|
|
//
|
|
// 2/15/04
|
|
//
|
|
// Fixed bugs in spawn_cfg_cusflag that caused flag values to be lost if
|
|
// specified as normal flags rather than custom flags (only affected the
|
|
// ALFA custom flags).
|
|
//
|
|
// 3/8/04
|
|
//
|
|
// 'Home' is now either the place a creature spawned in, or the place it
|
|
// *would have spawned in* if there wasn't an alternate specified by the EE
|
|
// flag. Hopefully, this restores it to its original, correct behavior.
|
|
//
|
|
// The initial delay subflag of IS should now work correctly.
|
|
//
|
|
// The corpse remains type default value was using one variable name in
|
|
// spawn_defaults to set it and a different one in spawn_functions to
|
|
// retrieve the value, which resulted in the default not working. This has
|
|
// been fixed.
|
|
//
|
|
// Added 2 new Patrol Route flags at Danmar's request. They are RPn (for
|
|
// random pause and RRn for Random Route. These allow for some
|
|
// randomization of patrol routes. The RRn flag sets the percentage chance
|
|
// that the next stop in a route will actually be gone to (otherwise it's
|
|
// skipped. RPn specifies a range to randomly choose an additional pause
|
|
// amount which is added to the value specified by PSn.
|
|
//
|
|
// At EPOlson's request, NESS will now look for a local string variable on
|
|
// the spawn waypoint named "NESS" for spawn flags. If no string is found
|
|
// (or if it does not start with "SP") then the flags specified in the
|
|
// waypoint name are used (just like it used to).
|
|
//
|
|
// NESS now has full support for using pseudo-heartbeats as an alternative
|
|
// to the standard area heartbeats. For those who wish to use this, remove
|
|
// Spawn() from your area heartbeat script (or, if spawn_sample_hb is your
|
|
// area haertbeat script, just remove that script from your areas' On
|
|
// Heartbeat slots) and call Spawn_OnAreaEnter() and Spawn_OnAreaExit()
|
|
// from your area On Enter and On Exit scripts respectively. Again, if you
|
|
// do no currrent have On Enter and or On Exit scripts in use for your areas
|
|
// you can use spawn_smpl_onent and spawn_smpl_onext which are provided with
|
|
// this release.
|
|
//
|
|
// Spawn_OnAreaEnter() takes up to 3 optional arguments. The first is the
|
|
// name of the script you want called when the pseudo-heartbeat happens.
|
|
// By default, spawn_sample_hb is called (which in turn just calls Spawn().
|
|
// You can put any script you like there, but remember that it will only be
|
|
// when PCs or NESS creatures are in the area. The second argument is the
|
|
// time between pseudo-heartbeats. The default is 6.0 seconds, which will
|
|
// result in Spawn() being called about as often as when you used regular
|
|
// area heartbeats. If you find you can get away with 10.0 seconds (that's
|
|
// what I'm currently using) you've reduced your NESS processing by 40%...
|
|
// The 3rd argument specifies a delay for the first heartbeat after a PC or
|
|
// PCs enter the area. In areas where there aren't a lot of spawns, and
|
|
// you are spawning in sight (like NPCs in a store) no delay is ideal. For
|
|
// outdoor areas with a lot of spawns that spawn away from the player, a
|
|
// delay helps prevent a spawn lag spike for the entering player. The
|
|
// default is 0.0 seconds (no delay). I'm currently delaying 3 seconds on
|
|
// all outdoor and underground areas, but no delay on indoor areas, by
|
|
// the following in my On Enter script:
|
|
//
|
|
// if ( GetIsAreaAboveGround( oCurrArea ) &&
|
|
// ! GetIsAreaNatural( oCurrArea ) )
|
|
// {
|
|
// // Indoors - no delay on the first HB
|
|
// Spawn_OnAreaEnter( "spawn_sample_hb", 10.0 );
|
|
// }
|
|
//
|
|
// else
|
|
// {
|
|
// // Outdoors or underground - do a 3 second delay on the first HB
|
|
// Spawn_OnAreaEnter( "spawn_sample_hb", 10.0, 3.0 );
|
|
// }
|
|
//
|
|
// Thanks to Mentha Arvensis who provided the starting scripts for pseudo-
|
|
// heartbeats.
|
|
//
|
|
//
|
|
// +++ Start Version 8.1.1
|
|
//
|
|
// 2/1/04 - 5/28/04
|
|
//
|
|
//
|
|
// NESS now allows you to specify the spawn tag by adding a variable, named
|
|
// "NESS_TAG", on the spawn waypoint. If this variable exists, it will use
|
|
// it's value as the spawn tag instead of waypoint's tag.
|
|
//
|
|
// Always retrieve spawn tag and spawn name from the variables written on
|
|
// the the spawn instead of using GetTag() an GetName(). This is necessary
|
|
// to support use of the "NESS" and "NESS_TAG" variables.
|
|
//
|
|
// Added a global flag, bLeftoversForceProcessing, to indicate whether or
|
|
// not spawned creatures in an area should cause NESS processing when no
|
|
// PCs are in the area. Default is TRUE (they do) which is how things
|
|
// worked before the flag was added. The flag essentially gives you the
|
|
// ability to suppress that behavior. To do so, set
|
|
// bLeftoversForceProcessing to FALSE in your spawn_cfg_global script.
|
|
//
|
|
// Added some bullet-proofing to check that spawn waypoints remain valid
|
|
// objects.
|
|
//
|
|
// Turned off ALL NESS processing of creatures that are DM possessed.
|
|
//
|
|
// Make sure a patrol waypoint actually exists before attempting to move to
|
|
// it.
|
|
//
|
|
// Normal Camp behavior is to despawn when all creatures in the camp have
|
|
// been destroyed. However, they were also despawning if there were never
|
|
// any creatures in the camp to begin with (a placeable-only camp). This
|
|
// was fixed.
|
|
//
|
|
// Loot/corpse decay was not working properly on camps, as the changes to
|
|
// this system to the regular spawns was never propagated to the camps.
|
|
// Fixed.
|
|
//
|
|
// +++ Start Version 8.1.2
|
|
//
|
|
// 5/30/04
|
|
//
|
|
// Advance routes to their next stop when patrol waypoints are missing
|
|
//
|
|
// +++ Start Version 8.1.3
|
|
//
|
|
// 7/04/04
|
|
//
|
|
// Write a local var onto entering PCs which can be checked on area exit
|
|
// to maintain a proper PC count. This is necessary because GetIsPC() does
|
|
// not work when a PC logs out.
|
|
//
|
|
// Don't call NESS_CleanInventory on camp placeables when a camp is
|
|
// destroyed, as the placeables may remain for a while.
|
|
//
|
|
// 7/05/04
|
|
//
|
|
// Added code to detect stalled patrol routes and jump the creature to it's
|
|
// intended destination. This can be turned off by setting
|
|
// CheckForStuckPatrols global variable to FALSE.
|
|
//
|
|
// Write oSpawn onto the camp object "before" the call to SetCampSpawn() so
|
|
// it is available to that function.
|
|
//
|
|
// Added flag to turn off corpse destruction when CD is not specified.
|
|
//
|
|
// Added additional on area enter script with indoor/outdoor checking to
|
|
// determine if an initial delay should be used.
|
|
//
|
|
// 7/06/04
|
|
//
|
|
// Added check to randomWalk for ACTION_CASTSPELL to avoid interruptions
|