Aantioch_Infernum/_module/nss/area_spawner.nss
EpicValor 44323d16c6 Added full CEP3 & Complete Rural/City tileset
Sarum City has been rebuilt with the new tileset, and all the exterior areas were combined into one. New areas added outside the city. They're called Environs.  Some additional areas redone to tie into the new areas. Environs are mostly decorated, but lack NPCs in some.  Those will be added later.
2023-11-17 01:59:49 -06:00

2149 lines
72 KiB
Plaintext

//::///////////////////////////////////////////////
//:: Name: NWN Spawner System v2.4.4c
//:: FileName: area_spawner
//:://////////////////////////////////////////////
/*
Complete Spawn System, one script.
Switch Descriptions are in the file
area_spawner_doc
*/
//:://////////////////////////////////////////////
//:: Created By: Palor <palor@truefear.net>
//:: Created On:
//:://////////////////////////////////////////////
//:: Modified By: Pat Weaver, aka - Dumascain
//:: Modified On: 22 Jan 03
//:://////////////////////////////////////////////
//Version Numbers. Do NOT change these
void sp_VersionInfo();
void sp_VersionInfo()
{
SetLocalInt(GetModule(), "NWNSS_Version", 244);
}
///////////////////////////
#include "NW_O2_CONINCLUDE"
// GROUP_INCLUDE
//#include "NWNSS_Groups"
int iDebug = 0;
int ACS_Version = GetLocalInt(GetModule(), "ACS_Version");
void sp_Main(object oNearest);
void sp_DestroyObject(object oNearest, string sTagType);
void sp_CheckVars(object oNearest, string sCurrentName);
void sp_Spawn(object oNearest, string sTemplate, int iSpawnX);
void sp_TagObject(object oNearest, string sTagType, object oNewObject);
void sp_TagItem(object oNearest, string sTagType, object oNewItem);
void sp_SpawnCamp(object oNearest, location lCurrentWP);
void sp_CheckTrap(object oNearest, object oPC);
void sp_AreaEffect(object oNearest);
void sp_CreateItem(object oNearest, object oLastSpawned);
void sp_PerformActions(object oNearest, object oCurrent);
void sp_GetDiceValue(object oNearest, string sCurrentName, string sNumDice, string sDice);
void sp_GetSpawnSites();
void sp_Debug(string sString);
void sp_CreateObject(object oNearest, string sBluePrint, int iToSpawn);
string sp_CheckSpawnSite(object oNearest);
string sp_SpawnChamp(object oNearest);
string sp_CleanString(object oNearest, string sType);
string sp_GetGroupObject(object oNearest, int iGroupTotal, string sTagType, object oLastSpawned=OBJECT_SELF);
int sp_GetValue(object oNearest, string sSwitch, string sCurrentName);
int sp_CreaturesToSpawn(object oNearest, int iAlive);
int sp_CheckDistance(object oNearest);
int sp_CheckTimeOfDay(object oNearest);
int sp_CheckObjects(object oNearest);
int sp_RollDice(int iNumDice, int iDice, int ReturnValue=FALSE);
int sp_GetIsPCInArea(object oArea, object oNearest);
int sp_GetGroupTotal(object oNearest, string sTagType);
int sp_CheckPlayerInventory(object oNearest, object oPC);
int sp_CheckRules(int iDontSpawn, int iAlive, object oNearest);
int sp_CheckLevel(object oNearest, object oPC);
int sp_PlayerView(object oCreature);
location sp_RandomLocation(object oNearest, int iRandArea);
void sp_ModInit();
void sp_ModInit()
{
// Groups
// Undead 1
SetLocalString(OBJECT_SELF, "group01_1", "NW_SKELETON");
SetLocalString(OBJECT_SELF, "group01_2", "NW_GHOUL");
SetLocalString(OBJECT_SELF, "group01_3", "NW_MUMMY");
SetLocalString(OBJECT_SELF, "group01_4", "NW_WRAITH");
SetLocalString(OBJECT_SELF, "group01_5", "NW_LICH003");
// Orcs 1
SetLocalString(OBJECT_SELF, "group02_1", "NW_ORCA");
SetLocalString(OBJECT_SELF, "group02_2", "NW_ORCB");
SetLocalString(OBJECT_SELF, "group02_3", "NW_OrcChiefA");
SetLocalString(OBJECT_SELF, "group02_4", "NW_ORCCHIEFB");
SetLocalString(OBJECT_SELF, "group02_5", "NW_ORCWIZA");
SetLocalString(OBJECT_SELF, "group02_6", "NW_ORCWIZB");
// Goblins 1
SetLocalString(OBJECT_SELF, "group03_1", "NW_GOBLINA");
SetLocalString(OBJECT_SELF, "group03_2", "NW_GOBLINA");
SetLocalString(OBJECT_SELF, "group03_3", "NW_GOBLINB");
SetLocalString(OBJECT_SELF, "group03_4", "NW_GOBCHIEFB");
SetLocalString(OBJECT_SELF, "group03_5", "NW_GOBLINA");
// Kobalt Group
SetLocalString(OBJECT_SELF, "group04_1", "nw_kobolt001");
SetLocalString(OBJECT_SELF, "group04_2", "nw_kobolt003");
SetLocalString(OBJECT_SELF, "group04_3", "nw_kobolt004");
SetLocalString(OBJECT_SELF, "group04_4", "nw_kobolt004");
SetLocalString(OBJECT_SELF, "group04_5", "nw_kobolt006");
// Fallen Group
SetLocalString(OBJECT_SELF, "group05_1", "fallen001");
SetLocalString(OBJECT_SELF, "group05_2", "fallen001");
SetLocalString(OBJECT_SELF, "group05_3", "fallenshaman");
SetLocalString(OBJECT_SELF, "group05_4", "fallen001");
SetLocalString(OBJECT_SELF, "group05_5", "fallen001");
// Forest Bandit Group
SetLocalString(OBJECT_SELF, "group06_1", "forestbandit001");
SetLocalString(OBJECT_SELF, "group06_2", "forestbandit");
SetLocalString(OBJECT_SELF, "group06_3", "forestbandit");
SetLocalString(OBJECT_SELF, "group06_4", "forestbandit");
SetLocalString(OBJECT_SELF, "group06_5", "forestbanditfem");
SetLocalString(OBJECT_SELF, "group06_6", "forestbanditfem");
// Lost Villagers
SetLocalString(OBJECT_SELF, "group07_1", "villager");
SetLocalString(OBJECT_SELF, "group07_2", "villager001");
SetLocalString(OBJECT_SELF, "group07_3", "villager002");
SetLocalString(OBJECT_SELF, "group07_4", "villager003");
// Barbarian Hoardsmen
SetLocalString(OBJECT_SELF, "group08_1", "barbarian1");
SetLocalString(OBJECT_SELF, "group08_2", "barbarian2");
SetLocalString(OBJECT_SELF, "group08_3", "barbarian3");
SetLocalString(OBJECT_SELF, "group08_4", "barbarian4");
SetLocalString(OBJECT_SELF, "group08_5", "barbarian5");
SetLocalString(OBJECT_SELF, "group08_6", "barbarian6");
SetLocalString(OBJECT_SELF, "group08_7", "barbarian7");
// Outpost Defenders
SetLocalString(OBJECT_SELF, "group09_1", "knight1");
SetLocalString(OBJECT_SELF, "group09_2", "knight2");
SetLocalString(OBJECT_SELF, "group09_3", "knight3");
SetLocalString(OBJECT_SELF, "group09_4", "knight4");
SetLocalString(OBJECT_SELF, "group09_5", "knight5");
SetLocalString(OBJECT_SELF, "group09_6", "knight6");
SetLocalString(OBJECT_SELF, "group09_7", "knight7");
// Newport Evil Druids
SetLocalString(OBJECT_SELF, "group10_1", "evil_druid_m");
SetLocalString(OBJECT_SELF, "group10_2", "evil_druid_f");
// Camp Equipment
SetLocalString(OBJECT_SELF, "camp01_tag_1", "Campfire");
SetLocalString(OBJECT_SELF, "camp01_resref_1", "plc_campfr");
//SetLocalString(OBJECT_SELF, "camp01_tag_2", "LootBag6");
//SetLocalString(OBJECT_SELF, "camp01_resref_2", "plc_lootbag6");
//SetLocalString(OBJECT_SELF, "camp01_tag_3", "LootBag5");
//SetLocalString(OBJECT_SELF, "camp01_resref_3", "plc_lootbag5");
//SetLocalString(OBJECT_SELF, "camp01_tag_4", "bed_rolls");
//SetLocalString(OBJECT_SELF, "camp01_resref_4", "bed_roll_4_camp");
// Champions
SetLocalString(OBJECT_SELF, "champ01", "NW_ORCWIZA");
SetLocalString(OBJECT_SELF, "champ02", "NW_ORCWIZB");
SetLocalString(OBJECT_SELF, "champ03", "NW_SLAADDTHBOSS");
SetLocalString(OBJECT_SELF, "champ04", "NW_ORCB");
// Single Items
SetLocalString(OBJECT_SELF, "item01", "NW_IT_BOOK018");
// Group Items
SetLocalString(OBJECT_SELF, "item01_1", "NW_IT_BOOK005");
SetLocalString(OBJECT_SELF, "item01_2", "NW_IT_BOOK018");
SetLocalString(OBJECT_SELF, "item01_3", "NW_IT_BOOK022");
// Animations
SetLocalInt(OBJECT_SELF, "anim01", ANIMATION_FIREFORGET_BOW);
SetLocalInt(OBJECT_SELF, "anim02", ANIMATION_FIREFORGET_DRINK);
SetLocalInt(OBJECT_SELF, "anim03", ANIMATION_FIREFORGET_HEAD_TURN_RIGHT);
SetLocalInt(OBJECT_SELF, "anim04", ANIMATION_FIREFORGET_HEAD_TURN_LEFT);
SetLocalInt(OBJECT_SELF, "anim05", ANIMATION_FIREFORGET_PAUSE_BORED);
SetLocalInt(OBJECT_SELF, "anim06", ANIMATION_FIREFORGET_DODGE_SIDE);
SetLocalInt(OBJECT_SELF, "anim07", ANIMATION_FIREFORGET_PAUSE_SCRATCH_HEAD);
SetLocalInt(OBJECT_SELF, "anim08", ANIMATION_FIREFORGET_READ);
SetLocalInt(OBJECT_SELF, "anim09", ANIMATION_FIREFORGET_STEAL);
SetLocalInt(OBJECT_SELF, "anim11", ANIMATION_FIREFORGET_GREETING);
SetLocalInt(OBJECT_SELF, "anim12", ANIMATION_FIREFORGET_VICTORY1);
SetLocalInt(OBJECT_SELF, "anim13", ANIMATION_FIREFORGET_VICTORY2);
SetLocalInt(OBJECT_SELF, "anim14", ANIMATION_FIREFORGET_VICTORY3);
SetLocalInt(OBJECT_SELF, "anim15", ANIMATION_LOOPING_MEDITATE);
SetLocalInt(OBJECT_SELF, "ModInit", 1);
}
void main()
{
// Start the heartbeat
// Setup Group, Champion, Item and Camp vars
if (!GetLocalInt(OBJECT_SELF, "ModInit"))
{
sp_VersionInfo();
sp_ModInit();
// GROUP_INCLUDE
//RegisterGroups();
}
// Check if spawn sites are set and if not store their locations.
if (GetLocalObject(OBJECT_SELF, "SpawnSite1") == OBJECT_INVALID)
{
sp_GetSpawnSites();
}
// If spawn sites exist, start the process.
int nNth = 1;
object oNearest = GetLocalObject(OBJECT_SELF, "SpawnSite" + IntToString(nNth));
if (oNearest == OBJECT_INVALID)
{
return;
}
while (oNearest != OBJECT_INVALID)
{
// Check for Area Control System
// Check spawner and see if a timer is already running and if
// the spawn site has been destroyed or not.
// Debug
if (iDebug == 3)
{
sp_Debug(GetName(oNearest));
}
if (!GetLocalInt(oNearest, "SpawnDestroyed"))
{
ActionDoCommand(sp_Main(oNearest));
}
nNth++;
oNearest = GetLocalObject(OBJECT_SELF, "SpawnSite" + IntToString(nNth));
}
}
// No comments beyond this point :)
void sp_DestroyObject(object oNearest, string sTagType)
{
// Debug
if (iDebug == 3)
sp_Debug("sp_DestroyObject");
SetLocalInt(oNearest, "DestroyedBySpawner", 1);
// Debug
if (iDebug == 1)
sp_Debug("Killing Creatures...");
int iCurObject;
object oCreatureToKill;
int iNumObjects;
if (sTagType == "Camp")
{
iNumObjects = sp_GetGroupTotal(oNearest, "Camp");
}
else
{
iNumObjects = GetLocalInt(oNearest, "SpawnAmount") +
GetLocalInt(oNearest, "SpawnRandomNumber");
}
for (iCurObject = iNumObjects; iCurObject > 0; iCurObject--)
{
oCreatureToKill = GetLocalObject(oNearest, sTagType + IntToString(iCurObject));
if (oCreatureToKill != OBJECT_INVALID)
{
if (GetLocalObject(oCreatureToKill, "SpawnedBy") == oNearest)
{
int iKillObjects;
if (GetLocalInt(oNearest, "PlayerView"))
{
if (sp_PlayerView(oCreatureToKill) != 1)
{
iKillObjects = 1;
}
}
else
{
iKillObjects = 1;
}
if ((!GetIsInCombat(oCreatureToKill) || sTagType == "Camp" ||
GetLocalInt(oNearest, "KillCreatures")) && iKillObjects)
{
// Debug
if (iDebug == 1)
{
sp_Debug("Killing " + sTagType);
sp_Debug("Tag - " + GetTag(oCreatureToKill));
}
if (GetLocalInt(oNearest, "DeathEffect") && sTagType == "Creature")
{
effect eDeath;
switch (GetLocalInt(oNearest, "DeathEffect"))
{
case 01: eDeath = EffectVisualEffect(VFX_FNF_SUMMON_MONSTER_1); break;
case 02: eDeath = EffectVisualEffect(VFX_FNF_SUMMON_MONSTER_2); break;
case 03: eDeath = EffectVisualEffect(VFX_FNF_SUMMON_MONSTER_3); break;
case 04: eDeath = EffectVisualEffect(VFX_FNF_SUMMON_UNDEAD); break;
case 05: eDeath = EffectVisualEffect(VFX_FNF_SUNBEAM); break;
case 06: eDeath = EffectVisualEffect(VFX_FNF_WAIL_O_BANSHEES); break;
case 07: eDeath = EffectVisualEffect(VFX_FNF_STORM); break;
case 08: eDeath = EffectVisualEffect(VFX_FNF_STRIKE_HOLY); break;
case 09: eDeath = EffectVisualEffect(VFX_FNF_IMPLOSION); break;
default: eDeath = EffectVisualEffect(VFX_NONE); break;
}
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eDeath, GetLocation(oCreatureToKill));
}
if (GetLocalInt(oNearest, "CORPSE_PERSIST"))
{
AssignCommand(oCreatureToKill, SetIsDestroyable(TRUE, FALSE, FALSE));
}
if (GetLocalInt(oNearest, "DespawnRemote"))
{
location lDespawnSite = GetLocation(GetLocalObject(OBJECT_SELF,
"RemoteSite" + IntToString(GetLocalInt(oNearest, "DespawnRemote"))));
if (GetCurrentAction(oCreatureToKill) != 36)
{
AssignCommand(oCreatureToKill, ClearAllActions());
AssignCommand(oCreatureToKill, ActionMoveToLocation(lDespawnSite));
}
if (GetDistanceBetweenLocations(GetLocation(oCreatureToKill), lDespawnSite) <= 2.0)
{
DestroyObject(oCreatureToKill, 0.0);
}
}
else
{
DestroyObject(oCreatureToKill, 0.0);
}
}
else if (GetLocalInt(oNearest, "IsTreasure") && iKillObjects)
{
DestroyObject(oCreatureToKill, 0.0);
}
}
}
}
}
void sp_CheckVars(object oNearest, string sCurrentName)
{
// Debug
if (iDebug == 3)
sp_Debug("sp_CheckVars");
// Debug
if (iDebug == 1)
sp_Debug("Checking Variables...");
SetLocalInt(oNearest, "ID", sp_GetValue(oNearest, "ID", sCurrentName));
SetLocalInt(oNearest, "CreatureGroupRandom", sp_GetValue(oNearest, "GR", sCurrentName));
SetLocalInt(oNearest, "GroupSpawn", sp_GetValue(oNearest, "GP", sCurrentName));
SetLocalInt(oNearest, "SpawnTimer", sp_GetValue(oNearest, "TM", sCurrentName));
SetLocalInt(oNearest, "SpawnAmount", sp_GetValue(oNearest, "SX", sCurrentName));
SetLocalInt(oNearest, "PC_Radius", sp_GetValue(oNearest, "RD", sCurrentName));
SetLocalInt(oNearest, "NPC_Radius", sp_GetValue(oNearest, "SR", sCurrentName));
SetLocalInt(oNearest, "SpawnDay", sp_GetValue(oNearest, "DT", sCurrentName));
SetLocalInt(oNearest, "SpawnNight", sp_GetValue(oNearest, "NT", sCurrentName));
SetLocalInt(oNearest, "IsTreasure", sp_GetValue(oNearest, "TR", sCurrentName));
SetLocalInt(oNearest, "SpawnEffect", sp_GetValue(oNearest, "VS", sCurrentName));
SetLocalInt(oNearest, "DeathEffect", sp_GetValue(oNearest, "VK", sCurrentName));
SetLocalInt(oNearest, "RandomWalk", sp_GetValue(oNearest, "RW", sCurrentName));
SetLocalInt(oNearest, "NearPlayer", sp_GetValue(oNearest, "NP", sCurrentName));
SetLocalInt(oNearest, "InCombat", sp_GetValue(oNearest, "IC", sCurrentName));
SetLocalInt(oNearest, "StopSpawn", sp_GetValue(oNearest, "SS", sCurrentName));
SetLocalInt(oNearest, "GenTreasure", sp_GetValue(oNearest, "GT", sCurrentName));
SetLocalInt(oNearest, "DelaySpawn", sp_GetValue(oNearest, "DS", sCurrentName));
SetLocalInt(oNearest, "Camp", sp_GetValue(oNearest, "CP", sCurrentName));
SetLocalInt(oNearest, "DaySpawn", sp_GetValue(oNearest, "SD", sCurrentName));
SetLocalInt(oNearest, "HourSpawn", sp_GetValue(oNearest, "SH", sCurrentName));
SetLocalInt(oNearest, "TrapType", sp_GetValue(oNearest, "TP", sCurrentName));
SetLocalInt(oNearest, "ChampSpawn", sp_GetValue(oNearest, "CH", sCurrentName));
SetLocalInt(oNearest, "ChampRemote", sp_GetValue(oNearest, "CR", sCurrentName));
SetLocalInt(oNearest, "RandomFacing", sp_GetValue(oNearest, "RF", sCurrentName));
SetLocalInt(oNearest, "AreaEffect", sp_GetValue(oNearest, "AE", sCurrentName));
SetLocalInt(oNearest, "ReturnHome", sp_GetValue(oNearest, "RH", sCurrentName));
SetLocalInt(oNearest, "CreateItem", sp_GetValue(oNearest, "CI", sCurrentName));
SetLocalInt(oNearest, "ItemGroup", sp_GetValue(oNearest, "IG", sCurrentName));
SetLocalInt(oNearest, "PlayerInventory", sp_GetValue(oNearest, "PI", sCurrentName));
SetLocalInt(oNearest, "PlayAnim", sp_GetValue(oNearest, "AN", sCurrentName));
SetLocalInt(oNearest, "SpawnRemote", sp_GetValue(oNearest, "EX", sCurrentName));
SetLocalInt(oNearest, "DespawnRemote", sp_GetValue(oNearest, "DX", sCurrentName));
SetLocalInt(oNearest, "PCInArea", sp_GetValue(oNearest, "PA", sCurrentName));
SetLocalInt(oNearest, "ResetTimer", sp_GetValue(oNearest, "RT", sCurrentName));
SetLocalInt(oNearest, "StartLevel", sp_GetValue(oNearest, "SL", sCurrentName));
SetLocalInt(oNearest, "MaxLevel", sp_GetValue(oNearest, "ML", sCurrentName));
SetLocalInt(oNearest, "PlayerView", sp_GetValue(oNearest, "PV", sCurrentName));
SetLocalInt(oNearest, "TrapDisarm", sp_GetValue(oNearest, "TD", sCurrentName));
SetLocalInt(oNearest, "KillTime", sp_GetValue(oNearest, "KT", sCurrentName));
SetLocalInt(oNearest, "ForceAttack", sp_GetValue(oNearest, "FA", sCurrentName));
// Start - Companion Script Switches
SetLocalInt(oNearest, "CORPSE_PERSIST", sp_GetValue(oNearest, "CC", sCurrentName));
SetLocalInt(oNearest, "PickupItems", sp_GetValue(oNearest, "PU", sCurrentName));
SetLocalInt(oNearest, "DontZone", sp_GetValue(oNearest, "DZ", sCurrentName));
SetLocalInt(oNearest, "PlayerKilled", sp_GetValue(oNearest, "PK", sCurrentName));
SetLocalInt(oNearest, "AutoEquip", sp_GetValue(oNearest, "AI", sCurrentName));
SetLocalInt(oNearest, "SitChair", sp_GetValue(oNearest, "SC", sCurrentName));
// End
SetLocalInt(oNearest, "NoFirst", sp_GetValue(oNearest, "NF", sCurrentName));
if (GetLocalInt(oNearest, "NoFirst"))
SetLocalInt(oNearest, "HasSpawned", 1);
SetLocalInt(oNearest, "IsSpawner", 1);
// If any actions are specified, set a var
if (GetLocalInt(oNearest, "RandomWalk") ||
GetLocalInt(oNearest, "ReturnHome") ||
GetLocalInt(oNearest, "RandomFacing") ||
GetLocalInt(oNearest, "ForceAttack") ||
GetLocalInt(oNearest, "PlayAnim") ||
GetLocalInt(oNearest, "PickupItems"))
SetLocalInt(oNearest, "DoActions", 1);
}
void sp_Spawn(object oNearest, string sTemplate, int iSpawnX)
{
// Debug
if (iDebug == 3)
sp_Debug("sp_Spawn");
if (!GetLocalInt(oNearest, "IsValid"))
{
// Debug
if (iDebug == 1)
sp_Debug("No longer valid. Stopping spawn.");
SetLocalInt(oNearest, "Spawning", GetLocalInt(oNearest, "Spawning") - iSpawnX);
return;
}
// Debug
if (iDebug == 1)
sp_Debug("Spawning...");
location lCurrentWP = GetLocation(oNearest);
if (GetLocalInt(oNearest, "SpawnChamp"))
{
sTemplate = GetStringLowerCase(GetLocalString(OBJECT_SELF, sTemplate));
SetLocalInt(oNearest, "ChampHasSpawned", 1);
DeleteLocalInt(oNearest, "SpawnChamp");
// Debug
if (iDebug == 2)
sp_Debug("Spawning Champion " + sTemplate);
}
int iGroupTotal;
int iValid;
int iTotalX;
for (iTotalX = 0; iTotalX < iSpawnX; iTotalX++)
{
iValid = 1;
if (GetLocalInt(oNearest, "GroupSpawn") && !GetLocalInt(oNearest, "ChampHasSpawned"))
{
iGroupTotal = sp_GetGroupTotal(oNearest, "Creature");
sTemplate = GetStringLowerCase(sp_GetGroupObject(oNearest, iGroupTotal, "Creature"));
// Debug
if (iDebug == 2)
sp_Debug("Spawning Group Creature " + sTemplate);
}
if (GetLocalInt(oNearest, "NPC_Radius") && iValid)
{
if (GetLocalInt(oNearest, "NearPlayer"))
{
object oPlayer = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC, oNearest);
if (oPlayer != OBJECT_INVALID)
{
lCurrentWP = sp_RandomLocation(oPlayer, GetLocalInt(oNearest, "NPC_Radius"));
}
else
{
iValid = 0;
// Debug
if (iDebug == 1)
{
sp_Debug("Player is not valid...");
}
}
}
else
{
lCurrentWP = sp_RandomLocation(oNearest, GetLocalInt(oNearest, "NPC_Radius"));
}
}
if (GetLocalInt(oNearest, "SpawnRemote"))
{
int iSpawnRemote;
if (GetLocalInt(oNearest, "ChampRemote"))
{
if (GetLocalInt(oNearest, "ChampHasSpawned"))
iSpawnRemote = 1;
}
else
{
iSpawnRemote = 1;
}
if (iSpawnRemote)
{
lCurrentWP = GetLocation(GetLocalObject(OBJECT_SELF, "RemoteSite" +
IntToString(GetLocalInt(oNearest, "SpawnRemote"))));
}
}
object oNewObject;
if (GetLocalInt(oNearest, "IsTreasure") && iValid)
{
oNewObject = CreateObject(OBJECT_TYPE_PLACEABLE, sTemplate, lCurrentWP, TRUE);
oNewObject = CreateObject(OBJECT_TYPE_ITEM, sTemplate, lCurrentWP, TRUE);
SetLocalInt(oNearest, "Spawning", GetLocalInt(oNearest, "Spawning") - 1);
sp_TagObject(oNearest, "Item", oNewObject);
}
else
{
if (GetLocalInt(oNearest, "SpawnEffect") && iValid)
{
effect eSpawn;
switch (GetLocalInt(oNearest, "SpawnEffect"))
{
case 01: eSpawn = EffectVisualEffect(VFX_FNF_SUMMON_MONSTER_1); break;
case 02: eSpawn = EffectVisualEffect(VFX_FNF_SUMMON_MONSTER_2); break;
case 03: eSpawn = EffectVisualEffect(VFX_FNF_SUMMON_MONSTER_3); break;
case 04: eSpawn = EffectVisualEffect(VFX_FNF_SUMMON_UNDEAD); break;
case 05: eSpawn = EffectVisualEffect(VFX_FNF_SUNBEAM); break;
case 06: eSpawn = EffectVisualEffect(VFX_FNF_WAIL_O_BANSHEES); break;
case 07: eSpawn = EffectVisualEffect(VFX_FNF_STORM); break;
case 08: eSpawn = EffectVisualEffect(VFX_FNF_STRIKE_HOLY); break;
case 09: eSpawn = EffectVisualEffect(VFX_FNF_IMPLOSION); break;
default: eSpawn = EffectVisualEffect(VFX_NONE); break;
}
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eSpawn, lCurrentWP);
}
oNewObject = CreateObject(OBJECT_TYPE_CREATURE, sTemplate, lCurrentWP, FALSE);
SetLocalInt(oNearest, "Spawning", GetLocalInt(oNearest, "Spawning") - 1);
sp_TagObject(oNearest, "Creature", oNewObject);
}
if (GetLocalInt(oNearest, "Camp") && !GetLocalInt(oNearest, "CampExists"))
sp_SpawnCamp(oNearest, lCurrentWP);
}
}
string sp_CleanString(object oNearest, string sType)
{
// Debug
if (iDebug == 3)
sp_Debug("sp_CleanString");
// Debug
else if (iDebug == 1)
{
sp_Debug("Cleaning String...");
}
string sCurrentTag = GetTag(oNearest);
if (GetStringLowerCase(GetStringLeft(sCurrentTag, 3)) == "wp_" && sType == "Tag")
{
sCurrentTag = GetStringRight(sCurrentTag, GetStringLength(sCurrentTag) - 3);
if (StringToInt(GetStringRight(sCurrentTag, 2)) &&
GetSubString(sCurrentTag, GetStringLength(sCurrentTag) - 3, 1) == "_")
sCurrentTag = GetStringLeft(sCurrentTag, GetStringLength(sCurrentTag) - 3);
}
else if (GetStringLowerCase(GetStringLeft(sCurrentTag, 3)) == "wn_" && sType == "Tag")
{
sCurrentTag = GetStringRight(sCurrentTag, GetStringLength(sCurrentTag) - 3);
if (StringToInt(GetStringRight(sCurrentTag, 2)) &&
GetSubString(sCurrentTag, GetStringLength(sCurrentTag) - 3, 1) == "_")
sCurrentTag = GetStringLeft(sCurrentTag, GetStringLength(sCurrentTag) - 3);
}
else if (GetStringLowerCase(GetStringLeft(sCurrentTag, 5)) == "post_" && sType == "Tag")
{
sCurrentTag = GetStringRight(sCurrentTag, GetStringLength(sCurrentTag) - 5);
}
else if (GetStringLowerCase(GetStringLeft(sCurrentTag, 6)) == "night_" && sType == "Tag")
{
sCurrentTag = GetStringRight(sCurrentTag, GetStringLength(sCurrentTag) - 5);
}
else if (sType == "Blueprint")
{
sCurrentTag = GetLocalString(oNearest, "Tag");
sCurrentTag = GetStringLowerCase(sCurrentTag);
}
return sCurrentTag;
}
int sp_CheckDistance(object oNearest)
{
// Debug
if (iDebug == 3)
{
sp_Debug("sp_CheckDistance");
}
else if (iDebug == 1)
{
sp_Debug("Checking Distance...");
}
int iRD = 0;
int iSpawnDistance = GetLocalInt(oNearest, "PC_Radius");
if (iSpawnDistance >= 1)
{
object oArea = GetArea(oNearest);
object oPC = GetFirstPC();
if (oPC != OBJECT_INVALID)
{
while (oPC != OBJECT_INVALID)
{
if (GetArea(oPC) == oArea)
{
if (GetDistanceBetween(oNearest, oPC) <= IntToFloat(iSpawnDistance))
{
if (GetLocalInt(oNearest, "TrapType"))
{
sp_CheckTrap(oNearest, oPC);
}
if (GetLocalInt(oNearest, "InCombat") && GetIsInCombat(oPC))
{
if (GetLocalInt(oNearest, "ChampSpawn") &&
GetLocalInt(oNearest, "HasSpawned") &&
!GetLocalInt(oNearest, "ChampHasSpawned"))
{
iRD = 1;
}
else
{
iRD = 2;
}
}
else
{
iRD = 1;
}
if (GetLocalInt(oNearest, "PlayerInventory"))
{
if (!sp_CheckPlayerInventory(oNearest, oPC))
{
iRD = 2;
}
}
if (GetLocalInt(oNearest, "CheckLevel"))
{
if (!sp_CheckLevel(oNearest, oPC))
{
iRD = 2;
}
}
}
}
if (iRD == 1 && GetLocalInt(oNearest, "ForceAttack") && oPC != OBJECT_INVALID)
{
SetLocalObject(oNearest, "NearestPC", oPC);
}
oPC = GetNextPC();
}
}
}
else
{
iRD = 1;
}
if (GetLocalInt(oNearest, "RD_DontSpawn"))
{
if (iRD == 1)
{
iRD = 0;
}
else
{
iRD = 1;
}
}
if (iRD == 1 && GetLocalInt(oNearest, "RD_NumDice") && !GetLocalInt(oNearest, "RD_DiceRolled"))
{
iRD = sp_RollDice(GetLocalInt(oNearest, "RD_NumDice"), GetLocalInt(oNearest, "RD_Dice"));
if (iRD == 1)
{
SetLocalInt(oNearest, "RD_DiceRolled", 1);
}
}
else if (iRD == 0 && GetLocalInt(oNearest, "RD_DiceRolled"))
{
SetLocalInt(oNearest, "RD_DiceRolled", 0);
}
return iRD;
}
int sp_CheckTimeOfDay(object oNearest)
{
// Debug
if (iDebug == 3) {
sp_Debug("sp_CheckTimeOfDay");
}
else if (iDebug == 1) {
sp_Debug("Checking Time of Day...");
}
int iValidTime = 1;
//
// Check Day and Night
if (GetIsDay() && GetLocalInt(oNearest, "SpawnDay")) {
iValidTime = 1;
}
else if (GetIsNight() && GetLocalInt(oNearest, "SpawnNight")) {
iValidTime = 1;
}
else if (GetLocalInt(oNearest, "SpawnDay") ||
GetLocalInt(oNearest, "SpawnNight")) {
iValidTime = 0;
}
//
// Check day specific
if (GetLocalInt(oNearest, "DaySpawn")) {
int iCalDay = GetCalendarDay();
int iStartDay = GetLocalInt(oNearest, "DaySpawn");
if (GetLocalInt(oNearest, "DayTimeThrough")) {
int iStopDay = GetLocalInt(oNearest, "DayTimeThrough");
if (iCalDay < iStartDay && iCalDay > iStopDay) {
iValidTime = 0;
}
else if (iStopDay > iStartDay) {
if (iCalDay < iStartDay || iCalDay > iStopDay) {
iValidTime = 0;
}
}
}
else if (iCalDay != iStartDay) {
iValidTime = 0;
}
}
//
// Check hour specific
if (GetLocalInt(oNearest, "HourSpawn")) {
int iHour = GetTimeHour();
int iStartHour = GetLocalInt(oNearest, "HourSpawn");
if (GetLocalInt(oNearest, "StartMidnight")) {
iStartHour = 0;
}
if (GetLocalInt(oNearest, "HourTimeThrough")) {
int iStopHour = GetLocalInt(oNearest, "HourTimeThrough");
if (GetLocalInt(oNearest, "ThroughMidnight")) {
iStopHour = 0;
}
if (iHour < iStartHour && iHour > iStopHour) {
iValidTime = 0;
}
else if (iStopHour > iStartHour) {
if (iHour < iStartHour || iHour > iStopHour) {
iValidTime = 0;
}
}
}
else if (iHour != iStartHour) {
iValidTime = 0;
}
}
if (GetLocalInt(oNearest, "KillTime")) {
if (GetLocalString(oNearest, "KillTime") == "Hour") {
if (GetLocalInt(oNearest, "KillTime") == GetTimeHour()) {
iValidTime = 0;
}
}
else if (GetLocalString(oNearest, "KillTime") == "Day") {
if (GetLocalInt(oNearest, "KillTime") == GetCalendarDay()) {
iValidTime = 0;
}
}
}
return iValidTime;
}
int sp_CheckObjects(object oNearest)
{
// Debug
if (iDebug == 3) {
sp_Debug("sp_CheckObjects");
}
else if (iDebug == 1) {
sp_Debug("Counting Creatures...");
}
int iMaxXX = GetLocalInt(oNearest, "SpawnAmount");
if (GetLocalInt(oNearest, "SpawnRandomNumber") > 0) {
iMaxXX += GetLocalInt(oNearest, "SpawnRandomNumber");
}
if (GetLocalInt(oNearest, "GroupSpawn") &&
!GetLocalInt(oNearest, "CreatureGroupRandom")) {
iMaxXX = sp_GetGroupTotal(oNearest, "Creature");
}
// Debug
if (iDebug == 2) {
sp_Debug("Max creatures is " + IntToString(iMaxXX));
}
int iAlive = 0;
int iCountSX_Dead = 0;
int iCreature;
int iDeadCreatures = 1;
object oCurrent;
for (iCreature = iMaxXX; iCreature > 0; iCreature--) {
oCurrent = GetLocalObject(oNearest, "Creature" + IntToString(iCreature));
if (oCurrent != OBJECT_INVALID && !GetIsDead(oCurrent)) {
iAlive++;
if (GetLocalInt(oNearest, "DoActions")) {
// TEST
// ActionDoCommand(sp_PerformActions(oNearest, oCurrent));
sp_PerformActions(oNearest, oCurrent);
}
}
else if (oCurrent != OBJECT_INVALID && GetIsDead(oCurrent)) {
DeleteLocalObject(oNearest, "Creature" + IntToString(iCreature));
SetLocalObject(oNearest, "DeadCreature" +
IntToString(iDeadCreatures), oCurrent);
iDeadCreatures++;
}
else if (GetLocalInt(oNearest, "IsTreasure")) {
oCurrent = GetLocalObject(oNearest, "Item" + IntToString(iCreature));
if (oCurrent != OBJECT_INVALID && GetTag(oCurrent) != "") {
iAlive++;
}
else {
DeleteLocalObject(oNearest, "Item" + IntToString(iCreature));
}
}
}
return iAlive;
}
int sp_CreaturesToSpawn(object oNearest, int iAlive)
{
// Debug
if (iDebug == 3) {
sp_Debug("sp_CreaturesToSpawn");
}
else if (iDebug == 1) {
sp_Debug("Determining Number To Spawn...");
}
int iSpawnRandom = GetLocalInt(oNearest, "SpawnRandomNumber");
int iMin = GetLocalInt(oNearest, "SpawnAmount");
int iMaxXX = iMin;
int iCountSX_Dead;
if (iSpawnRandom > 0) {
iMaxXX += iSpawnRandom;
}
if (GetLocalInt(oNearest, "GroupSpawn") &&
!GetLocalInt(oNearest, "CreatureGroupRandom")) {
iMaxXX = sp_GetGroupTotal(oNearest, "Creature");
return iMaxXX - iAlive;
}
iCountSX_Dead = iMaxXX - iAlive;
if (iCountSX_Dead > 0 && iSpawnRandom > 0) {
int iAlive = iMaxXX - iCountSX_Dead;
if (iAlive < iMin) {
int iRand = iMaxXX - iAlive;
iCountSX_Dead = Random(iRand)+1;
}
else {
iCountSX_Dead = 0;
}
}
if (GetLocalInt(oNearest, "SpawnSingle") && iCountSX_Dead > 1) {
return 1;
}
else {
return iCountSX_Dead;
}
}
int sp_GetValue(object oNearest, string sSwitch, string sCurrentName)
{
// Debug
if (iDebug == 3) {
sp_Debug("sp_GetValue");
}
else if (iDebug == 1) {
sp_Debug("Getting Variable Values...");
}
int iSwitchValue = 0;
int iIsMinutes = 0;
int iIsHours = 0;
if (FindSubString(sCurrentName, sSwitch) > 0) {
if (sSwitch == "TR" || // Treasure
sSwitch == "NP" || // Spawn near player
sSwitch == "NF" || // Skip the timer during module loading
sSwitch == "IC" || // Do not spawn if in combat
sSwitch == "SS" || // Stop spawn after all are dead
sSwitch == "GP" || // Spawn a group
sSwitch == "GR" || // Spawn random from group
sSwitch == "RF" || // Face random direction
sSwitch == "CR" || // Spawn champ remotely
sSwitch == "PA" || // Spawn only if player is in the area
sSwitch == "RT" || // Reset timer
sSwitch == "PV" || // Player in view
sSwitch == "FA" || // Force Attack
// Third party switches
sSwitch == "DZ" ||
sSwitch == "PK" ||
sSwitch == "CC" ||
sSwitch == "AI" ||
sSwitch == "DS") {
iSwitchValue = 1;
}
else {
int iNumberPos = FindSubString(sCurrentName, sSwitch);
if (sSwitch == "TM") {
if (GetSubString(sCurrentName, (iNumberPos + 4), 1) == "M") {
iIsMinutes = 1;
}
else if (GetSubString(sCurrentName, (iNumberPos + 4), 1) == "H") {
iIsHours = 1;
}
}
else if (sSwitch == "SX") {
if (GetSubString(sCurrentName, (iNumberPos + 4), 1) == "S") {
SetLocalInt(oNearest, "SpawnSingle", 1);
}
}
int iNumberLength = GetStringLength(sCurrentName) - iNumberPos;
string sSwitchValue = GetSubString(sCurrentName, (iNumberPos + 2), 2);
iSwitchValue = StringToInt(sSwitchValue);
if (iIsMinutes == 1) {
iSwitchValue = iSwitchValue * 60;
}
else if (iIsHours == 1) {
iSwitchValue = (iSwitchValue * 60) * 60;
}
if ((sSwitch == "SD" || sSwitch == "SH")) {
if (iSwitchValue == 0) {
iSwitchValue = 1;
SetLocalInt(oNearest, "StartMidnight", 1);
}
if (GetSubString(sCurrentName, (iNumberPos + 4), 1) == "T") {
int iTime = StringToInt(GetSubString(sCurrentName, (iNumberPos + 5), 2));
if (iTime == 0) {
iTime = 1;
SetLocalInt(oNearest, "ThroughMidnight", 1);
}
if (sSwitch == "SD") {
SetLocalInt(oNearest, "DayTimeThrough", iTime);
}
else if (sSwitch == "SH") {
SetLocalInt(oNearest, "HourTimeThrough", iTime);
}
}
}
else if (sSwitch == "TP" && GetSubString(sCurrentName,
(iNumberPos + 4), 1) == "A") {
SetLocalInt(oNearest, "TrapAmulet", StringToInt(GetSubString(
sCurrentName, (iNumberPos + 5), 2)));
}
else if (sSwitch == "CH") {
if (GetSubString(sCurrentName, (iNumberPos + 4), 1) == "R") {
string sStringToParse = GetStringRight(sCurrentName, iNumberLength);
sp_GetDiceValue(oNearest, sStringToParse, "CH_NumDice", "CH_Dice");
}
}
else if (sSwitch == "CI") {
if (GetSubString(sCurrentName, (iNumberPos + 4), 1) == "R") {
string sStringToParse = GetStringRight(sCurrentName, iNumberLength);
sp_GetDiceValue(oNearest, sStringToParse, "CI_NumDice", "CI_Dice");
}
}
else if (sSwitch == "GT") {
if (GetSubString(sCurrentName, (iNumberPos + 4), 1) == "R") {
string sStringToParse = GetStringRight(sCurrentName, iNumberLength);
sp_GetDiceValue(oNearest, sStringToParse, "GT_NumDice", "GT_Dice");
}
}
else if (sSwitch == "IG") {
iSwitchValue = 1;
if (GetSubString(sCurrentName, (iNumberPos + 2), 1) == "R") {
SetLocalInt(oNearest, "IG_Random", 1);
}
}
else if (sSwitch == "PI") {
if (GetSubString(sCurrentName, (iNumberPos + 4), 1) == "X") {
SetLocalInt(oNearest, "InInventory", 1);
}
else if (GetSubString(sCurrentName, (iNumberPos + 4), 1) == "D") {
SetLocalInt(oNearest, "DestroyItem", 1);
}
}
else if (sSwitch == "TD") {
iSwitchValue = 1;
if (GetSubString(sCurrentName, (iNumberPos + 2), 1) == "R") {
string sStringToParse = GetStringRight(sCurrentName, iNumberLength);
sp_GetDiceValue(oNearest, sStringToParse, "TD_NumDice", "TD_Dice");
}
}
else if (sSwitch == "RD") {
if (GetSubString(sCurrentName, (iNumberPos + 4), 1) == "X") {
SetLocalInt(oNearest, "KillCreatures", 1);
}
else if (GetSubString(sCurrentName, (iNumberPos + 4), 1) == "N") {
SetLocalInt(oNearest, "RD_DontSpawn", 1);
}
else if (GetSubString(sCurrentName, (iNumberPos + 4), 1) == "R") {
string sStringToParse = GetStringRight(sCurrentName, iNumberLength);
sp_GetDiceValue(oNearest, sStringToParse, "RD_NumDice", "RD_Dice");
}
}
else if (sSwitch == "NT") {
iSwitchValue = 1;
if (GetSubString(sCurrentName, (iNumberPos + 2), 1) == "X") {
SetLocalInt(oNearest, "KillCreatures", 1);
}
}
else if (sSwitch == "DT") {
iSwitchValue = 1;
if (GetSubString(sCurrentName, (iNumberPos + 2), 1) == "X") {
SetLocalInt(oNearest, "KillCreatures", 1);
}
}
else if (sSwitch == "ML" || sSwitch == "SL") {
SetLocalInt(oNearest, "CheckLevel", 1);
}
else if (sSwitch == "RW") {
if (iSwitchValue < 1) {
iSwitchValue = 1;
}
if (GetSubString(sCurrentName, (iNumberPos + 2), 1) != "_") {
if (GetSubString(sCurrentName, (iNumberPos + 4), 1) == "R") {
string sStringToParse = GetStringRight(sCurrentName, iNumberLength);
sp_GetDiceValue(oNearest, sStringToParse, "RW_NumDice", "RW_Dice");
}
}
}
else if (sSwitch == "AN") {
if (GetSubString(sCurrentName, (iNumberPos + 4), 1) == "L") {
SetLocalInt(oNearest, "AnimLoop", StringToInt(GetSubString(
sCurrentName, (iNumberPos + 5), 2)));
}
}
else if (sSwitch == "RH") {
if (GetSubString(sCurrentName, (iNumberPos + 2), 1) == "F") {
SetLocalInt(oNearest, "AboutFace", 1);
}
iSwitchValue = 1;
}
else if (sSwitch == "ID") {
SetLocalObject(GetModule(),
"Spawner" + IntToString(iSwitchValue), oNearest);
}
else if (sSwitch == "KT") {
if (GetSubString(sCurrentName, (iNumberPos + 4), 1) == "H") {
SetLocalString(oNearest, "KillTime", "Hour");
}
else if (GetSubString(sCurrentName, (iNumberPos + 4), 1) == "D") {
SetLocalString(oNearest, "KillTime", "Day");
}
}
else if (GetSubString(sCurrentName, (iNumberPos + 4), 1) == "R") {
int iMaxRand = StringToInt(GetSubString(
sCurrentName, (iNumberPos + 5), 2));
if (sSwitch == "SX") {
if (iSwitchValue < 1) {
iSwitchValue = 1;
}
else if (iMaxRand < 1) {
iMaxRand = 1;
}
SetLocalInt(oNearest, "SpawnRandomNumber", iMaxRand - iSwitchValue);
}
else if (sSwitch == "AE") {
SetLocalInt(oNearest, "AreaEffectRadius", iMaxRand);
}
else {
if (GetSubString(sCurrentName, (iNumberPos + 7), 1) == "M") {
iIsMinutes = 1;
iMaxRand = iMaxRand * 60;
iSwitchValue = iSwitchValue * 60;
}
else if (GetSubString(sCurrentName, (iNumberPos + 7), 1) == "H") {
iMaxRand = (iMaxRand * 60) * 60;
iSwitchValue = (iSwitchValue * 60) * 60;
}
SetLocalInt(oNearest, "TimerIsRandom", iMaxRand - iSwitchValue);
}
}
}
}
else if (sSwitch == "SX") {
if (GetLocalInt(oNearest, "GroupSpawn") &&
!GetLocalInt(oNearest, "CreatureGroupRandom")) {
iSwitchValue = sp_GetGroupTotal(oNearest, "Creature");
}
else {
iSwitchValue = 1;
}
}
return iSwitchValue;
}
int sp_GetGroupTotal(object oNearest, string sTagType) {
// Debug
if (iDebug == 3) {
sp_Debug("sp_GetGroupTotal");
}
else if (iDebug == 1) {
sp_Debug("Checking group total...");
}
int iGroupValid = 0;
int iGroupTotal = 1;
string sTemplate;
if (sTagType == "Creature") {
// Debug
if (iDebug == 1) {
sp_Debug("Checking group Creature...");
}
sTemplate = GetStringLowerCase(GetLocalString(oNearest, "Tag"));
}
else if (sTagType == "Camp") {
sTemplate = "camp";
// Debug
if (iDebug == 1) {
sp_Debug("Checking group Camp...");
}
if (GetLocalInt(oNearest, "Camp") < 10) {
sTemplate += "0" + IntToString(GetLocalInt(oNearest, "Camp"));
}
else {
sTemplate += IntToString(GetLocalInt(oNearest, "Camp"));
}
}
else if (sTagType == "Item") {
sTemplate = "item";
// Debug
if (iDebug == 1) {
sp_Debug("Checking group Item...");
}
if (GetLocalInt(oNearest, "CreateItem") < 10) {
sTemplate += "0" + IntToString(GetLocalInt(oNearest, "CreateItem"));
}
else {
sTemplate += IntToString(GetLocalInt(oNearest, "CreateItem"));
}
}
string sGroup;
while (iGroupValid != 1) {
if (sTagType == "Creature") {
sGroup = GetStringLowerCase(sTemplate) + "_" + IntToString(iGroupTotal);
}
if (sTagType == "Item") {
sGroup = GetStringLowerCase(sTemplate) + "_" + IntToString(iGroupTotal);
}
else if (sTagType == "Camp") {
sGroup = GetStringLowerCase(sTemplate) + "_resref_" +
IntToString(iGroupTotal);
}
if (GetLocalString(OBJECT_SELF, sGroup) == "") {
iGroupValid = 1;
iGroupTotal--;
}
else {
iGroupTotal++;
}
}
return iGroupTotal;
}
string sp_SpawnChamp(object oNearest) {
// Debug
if (iDebug == 3) {
sp_Debug("sp_SpawnChamp");
}
int iChampValid;
int iChampNumDie = GetLocalInt(oNearest, "CH_NumDice");
int iChampDie = GetLocalInt(oNearest, "CH_Dice");
int iDieResult;
if (!iChampNumDie) {
iChampValid = 1;
}
else {
iChampValid = sp_RollDice(iChampNumDie, iChampDie);
}
string sChamp;
if (iChampValid) {
SetLocalInt(oNearest, "SpawnChamp", 1);
int iChampNum = GetLocalInt(oNearest, "ChampSpawn");
sChamp = "champ";
if (iChampNum >= 10) {
sChamp += IntToString(iChampNum);
}
else {
sChamp += "0" + IntToString(iChampNum);
}
}
return sChamp;
}
string sp_GetGroupObject(object oNearest, int iGroupTotal, string sTagType, object oLastSpawned=OBJECT_SELF) {
// Debug
if (iDebug == 3) {
sp_Debug("sp_GetGroupObjectt");
}
int iSpawnRand;
string sGroup;
string sCurrentTag;
string sTemplate;
// Check for creature group random
if (GetLocalInt(oNearest, sTagType + "GroupRandom")) {
iSpawnRand = Random(iGroupTotal)+1;
if (sTagType == "Creature") {
sGroup = GetStringLowerCase(GetLocalString(oNearest, "Tag")) +
"_" + IntToString(iSpawnRand);
}
sCurrentTag = GetLocalString(OBJECT_SELF, sGroup);
return sCurrentTag;
}
else if (GetLocalInt(oNearest, "IG_Random")) {
int iGroupItem = Random(iGroupTotal) + 1;
sGroup = "item";
if (GetLocalInt(oNearest, "CreateItem") < 10) {
sGroup += "0";
}
sGroup += IntToString(GetLocalInt(oNearest, "CreateItem")) +
"_" + IntToString(iGroupItem);
sCurrentTag = GetLocalString(OBJECT_SELF, sGroup);
return sCurrentTag;
}
// Not random so get the whole group
else {
object oCurrent;
int iCreature;
int iGroup;
for (iGroup = iGroupTotal; iGroup > 0; iGroup--) {
if (sTagType == "Creature") {
sGroup = GetStringLowerCase(GetLocalString(oNearest, "Tag")) +
"_" + IntToString(iGroup);
}
else if (sTagType == "Item") {
sGroup = "item";
if (GetLocalInt(oNearest, "CreateItem") < 10) {
sGroup += "0";
}
sGroup += IntToString(GetLocalInt(oNearest, "CreateItem")) +
"_" + IntToString(iGroup);
}
sCurrentTag = GetLocalString(OBJECT_SELF, sGroup);
int iValid = 0;
if (sTagType == "Creature") {
for (iCreature = iGroupTotal; iCreature >= 1; iCreature--) {
oCurrent = GetLocalObject(oNearest, sTagType +
IntToString(iCreature));
if (oCurrent != OBJECT_INVALID) {
if (sCurrentTag == GetTag(oCurrent)) {
iValid = 1;
}
}
}
}
else if (sTagType == "Item") {
object oCurItem = GetFirstItemInInventory(oLastSpawned);
if (sCurrentTag == GetTag(oCurItem)) {
iValid = 1;
}
else {
if (oCurItem != OBJECT_INVALID) {
while (oCurItem != OBJECT_INVALID && iValid != 1) {
oCurItem = GetNextItemInInventory(oLastSpawned);
if (sCurrentTag == GetTag(oCurItem)) {
iValid = 1;
}
}
}
}
}
if (iValid != 1) {
return sCurrentTag;
}
}
}
if (sTemplate == "") {
// Debug
if (iDebug == 1) {
sp_Debug("Template is blank");
}
}
else if (iDebug == 1) { // Debug
sp_Debug("Template - " + sTemplate);
}
return sCurrentTag;
}
void sp_TagObject(object oNearest, string sTagType, object oNewObject) {
// Debug
if (iDebug == 3) {
sp_Debug("sp_TagObject");
}
int iCreature;
object oCreature;
SetLocalObject(oNewObject, "SpawnedBy", oNearest);
iCreature = 1;
oCreature = GetLocalObject(oNearest, sTagType +
IntToString(iCreature));
while (oCreature != OBJECT_INVALID) {
iCreature++;
oCreature = GetLocalObject(oNearest, sTagType +
IntToString(iCreature));
}
SetLocalObject(oNearest, sTagType +
IntToString(iCreature),
oNewObject);
if (GetLocalInt(oNearest, "CORPSE_PERSIST") && sTagType == "Creature") {
SetLocalInt(oNewObject, "CORPSE_PERSIST", 1);
AssignCommand(oNewObject, SetIsDestroyable(FALSE, FALSE, FALSE));
}
if (GetLocalInt(oNearest, "GenTreasure") && sTagType == "Creature") {
int iGTNumDie = GetLocalInt(oNearest, "CH_NumDice");
int iGTDice = GetLocalInt(oNearest, "CH_Dice");
int iGTValid;
if (!iGTNumDie) {
iGTValid = 1;
}
else {
iGTValid = sp_RollDice(iGTNumDie, iGTDice);
}
if (iGTValid)
{
switch (GetLocalInt(oNearest, "GenTreasure"))
{
case 01:GenerateLowTreasure(oNewObject);break;
case 02:GenerateMediumTreasure(oNewObject);break;
case 03:GenerateHighTreasure(oNewObject);break;
case 04:GenerateBossTreasure(oNewObject);break;
}
}
}
if (GetLocalInt(oNearest, "CreateItem")) {
sp_CreateItem(oNearest, oNewObject);
}
if (sTagType == "Item" && GetLocalInt(oNearest, "TrapDisarm")) {
if (GetIsTrapped(oNewObject) && GetTrapDisarmable(oNewObject)) {
int iTrapNumDice = GetLocalInt(oNearest, "TD_NumDice");
int iTrapDice = GetLocalInt(oNearest, "TD_Dice");
int iTrapValid = sp_RollDice(iTrapNumDice, iTrapDice);
if (iTrapValid) {
SetTrapDisabled(oNewObject);
}
}
}
if (GetLocalInt(oNearest, "ForceAttack")) {
object oPC = GetLocalObject(oNearest, "NearestPC");
if (oPC != OBJECT_INVALID) {
AssignCommand(oNewObject, ClearAllActions());
AssignCommand(oNewObject, ActionAttack(oPC));
}
}
// Debug
if (iDebug == 1) {
sp_Debug("Owner of " + GetTag(oNewObject) +
" is " +
GetName(GetLocalObject(
oNewObject, "SpawnedBy")));
}
}
void sp_SpawnCamp(object oNearest, location lCurrentWP) {
// Debug
if (iDebug == 3) {
sp_Debug("sp_SpawnCamp");
}
location lMyLoc;
location lObjectLoc;
int iCampEquip = 0;
int iItem = 1;
int iCamp = GetLocalInt(oNearest, "Camp");
string sCamp;
if (iCamp < 10) {
sCamp = "camp0" + IntToString(iCamp);
}
else {
sCamp = "camp" + IntToString(iCamp);
}
while (iCampEquip != 1) {
lMyLoc = lCurrentWP;
string sItemResRef = GetLocalString(OBJECT_SELF, sCamp + "_resref_" +
IntToString(iItem));
if (sItemResRef != "") {
lObjectLoc = GetLocation(GetNearestObjectToLocation(
OBJECT_TYPE_PLACEABLE, lCurrentWP));
if (GetDistanceBetweenLocations(lMyLoc, lObjectLoc) < 2.0 ) {
int iLocValid ;
for (iLocValid = 0; iLocValid != 1; iLocValid++) {
lMyLoc = sp_RandomLocation(oNearest, 1);
lObjectLoc = GetLocation(GetNearestObjectToLocation(
OBJECT_TYPE_PLACEABLE, lMyLoc));
if (GetDistanceBetweenLocations(lMyLoc, lObjectLoc) > 2.0 ) {
iLocValid = 1;
}
}
}
object oNewObject = CreateObject(OBJECT_TYPE_PLACEABLE, sItemResRef, lMyLoc, TRUE);
sp_TagObject(oNearest, "Camp", oNewObject);
iItem++;
}
else {
iCampEquip = 1;
SetLocalInt(oNearest, "CampExists", 1);
}
}
}
void sp_CheckTrap(object oNearest, object oPC)
{
// Debug
if (iDebug == 3) {
sp_Debug("sp_CheckTrap");
}
else if (iDebug == 1) {
sp_Debug("Checking Trap...");
}
effect eDamage;
effect eEffect;
string sDamageCause;
string sAmulet = "blank";
if (oPC != OBJECT_INVALID) {
// Debug
if (iDebug == 1) {
sp_Debug("PC is valid...");
}
switch (GetLocalInt(oNearest, "TrapType")) {
case 01:
eDamage = EffectDamage(d4(),
DAMAGE_TYPE_MAGICAL, DAMAGE_POWER_PLUS_FIVE);
eEffect = EffectVisualEffect(VFX_FNF_GAS_EXPLOSION_NATURE);
sDamageCause = "You have stumbled into a poisonous fog.";
break;
case 02:
eDamage = EffectDamage(d4(),
DAMAGE_TYPE_MAGICAL, DAMAGE_POWER_PLUS_FIVE);
eEffect = EffectVisualEffect(VFX_FNF_GAS_EXPLOSION_EVIL);
sDamageCause = "You have stumbled into a poisonous fog.";
break;
default:
eDamage = EffectDamage(d4(),
DAMAGE_TYPE_MAGICAL, DAMAGE_POWER_PLUS_FIVE);
eEffect = EffectVisualEffect(VFX_FNF_GAS_EXPLOSION_NATURE);
sDamageCause = "You have stumbled into a poisonous fog.";
break;
}
if (GetLocalInt(oNearest, "TrapAmulet")) {
// Debug
if (iDebug == 1) {
sp_Debug("Checking for Amulet...");
}
switch (GetLocalInt(oNearest, "TrapAmulet")) {
case 01: sAmulet = "PalorsAmulet"; break;
case 02: sAmulet = "PalorsOtherAmulet"; break;
}
}
if (GetTag(GetItemInSlot(INVENTORY_SLOT_NECK, oPC)) != sAmulet) {
// Debug
if (iDebug == 1) {
sp_Debug("PC does not have Amulet...");
}
SendMessageToPC(oPC, sDamageCause);
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eEffect,
GetLocation(oPC));
ApplyEffectToObject(DURATION_TYPE_INSTANT, eDamage, oPC);
}
}
else {
// Debug
if (iDebug == 1) {
sp_Debug("PC is not valid...");
}
}
}
void sp_AreaEffect(object oNearest)
{
// Debug
if (iDebug == 3) {
sp_Debug("sp_AreaEffect");
}
else if (iDebug == 1) {
sp_Debug("Setting Area Effect...");
}
int iEffectRadius = GetLocalInt(oNearest, "AreaEffectRadius");
if (!iEffectRadius) {
iEffectRadius = 5;
}
effect eAreaEffect;
switch (GetLocalInt(oNearest, "AreaEffect")) {
case 1: eAreaEffect = EffectVisualEffect(VFX_FNF_SMOKE_PUFF);break;
case 2: eAreaEffect = EffectVisualEffect(VFX_FNF_GAS_EXPLOSION_NATURE);break;
default: eAreaEffect = EffectVisualEffect(VFX_FNF_SMOKE_PUFF);break;
}
location lAreaLoc = sp_RandomLocation(oNearest, iEffectRadius);
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eAreaEffect, lAreaLoc);
}
int sp_RollDice(int iNumDice, int iDice, int ReturnValue=FALSE) {
// Debug
if (iDebug == 3) {
sp_Debug("sp_RollDice");
}
int iDieResult;
switch (iDice) {
case 2: iDieResult = d2(iNumDice); break;
case 3: iDieResult = d3(iNumDice); break;
case 4: iDieResult = d4(iNumDice); break;
case 6: iDieResult = d6(iNumDice); break;
case 8: iDieResult = d8(iNumDice); break;
case 10: iDieResult = d10(iNumDice); break;
case 12: iDieResult = d12(iNumDice); break;
case 20: iDieResult = d20(iNumDice); break;
case 100: iDieResult = d100(iNumDice); break;
default:;break;
}
int iRand = iNumDice * iDice;
iRand = Random(iRand) + 1;
if (iRand < iNumDice) {
iRand = iNumDice;
}
if (ReturnValue) {
return iDieResult;
}
else if (iDieResult == iRand) {
return TRUE;
}
else {
return FALSE;
}
}
void sp_GetDiceValue(object oNearest, string sCurrentName, string sNumDice, string sDice) {
// Debug
if (iDebug == 3) {
sp_Debug("sp_GetDiceValue");
}
if (FindSubString(sCurrentName, "_") >= 1) {
sCurrentName = GetStringLeft(sCurrentName, FindSubString(sCurrentName, "_"));
}
while (!StringToInt(GetStringLeft(sCurrentName, 1))) {
sCurrentName = GetStringRight(sCurrentName, GetStringLength(sCurrentName) - 1);
}
if (GetSubString(sCurrentName, 2, 1) == "R") {
sCurrentName = GetStringRight(sCurrentName, GetStringLength(sCurrentName) - 3);
}
SetLocalInt(oNearest, sNumDice,
StringToInt(GetStringLeft(
sCurrentName, FindSubString(sCurrentName, "d"))));
SetLocalInt(oNearest, sDice,
StringToInt(GetStringRight(
sCurrentName, (GetStringLength(sCurrentName) -
FindSubString(sCurrentName, "d")) - 1)));
}
int sp_CheckPlayerInventory(object oNearest, object oPC) {
// Debug
if (iDebug == 3) {
sp_Debug("sp_CheckPlayerInventory");
}
int iInInventory = GetLocalInt(oNearest, "InInventory");
int iPlayerHas;
int iSpawnValid;
int iItem = GetLocalInt(oNearest, "PlayerInventory");
string sItem = "item";
if (iItem < 10) {
sItem += "0" + IntToString(iItem);
}
else {
sItem += IntToString(iItem);
}
string sItemTag = GetLocalString(OBJECT_SELF, sItem);
object oItem = GetFirstItemInInventory(oPC);
while (oItem != OBJECT_INVALID && iPlayerHas != 1) {
if (GetTag(oItem) == sItemTag) {
iPlayerHas = 1;
if (GetLocalInt(oNearest, "DestroyItem")) {
DestroyObject(oItem);
}
}
oItem = GetNextItemInInventory(oPC);
}
if (iInInventory && !iPlayerHas) {
iSpawnValid = 1;
}
else if (!iInInventory && iPlayerHas) {
iSpawnValid = 1;
}
return iSpawnValid;
}
location sp_RandomLocation(object oNearest, int iRandArea)
{
// Debug
if (iDebug == 3) {
sp_Debug("sp_RandomLocation");
}
else if (iDebug == 1) {
sp_Debug("Choosing Random Location...");
}
vector vNewPos = GetPosition(oNearest);
object oArea = GetArea(oNearest);
float fX, fY;
float fMaxY;
float fRadius = IntToFloat(iRandArea);
fX = (Random(200)/100.0 - 1.0) * fRadius;
fMaxY=sqrt(fRadius*fRadius-fX*fX);
fY = (Random(200)/100.0 - 1.0) * fMaxY;
vNewPos += Vector(fX, fY, 0.0);
location lNewLoc = Location(oArea, vNewPos, VectorToAngle(-1.0 * vNewPos));
return lNewLoc;
}
void sp_PerformActions(object oNearest, object oCurrent) {
if (GetLocalInt(oNearest, "PickupItems"))
{
object oPickup = GetNearestObject(OBJECT_TYPE_ITEM, oNearest);
object oCurrent = GetNearestCreatureToLocation(CREATURE_TYPE_PLAYER_CHAR, FALSE, GetLocation(oPickup), 1, CREATURE_TYPE_IS_ALIVE, TRUE);
if (GetDistanceBetweenLocations(GetLocation(oPickup),
GetLocation(oCurrent)) < 40.0)
{
if (GetLocalInt(oCurrent, "PickupItems"))
{
AssignCommand(oCurrent, ClearAllActions());
AssignCommand(oCurrent, ActionForceMoveToObject(oPickup, FALSE, 5.0f, 10.0f));
AssignCommand(oCurrent, ActionForceMoveToObject(oPickup, FALSE, 1.0f, 10.0f));
AssignCommand(oCurrent, ActionPickUpItem(oPickup));
AssignCommand(oCurrent, ActionSpeakString("Ooh, a piece of candy!"));
}
}
}
// Debug
if (iDebug == 3) {
sp_Debug("sp_PerformActions");
}
if (GetLocalInt(oNearest, "ReturnHome") && GetLocalInt(oNearest, "RandomWalk")) {
if (GetDistanceBetweenLocations(GetLocation(oCurrent),
GetLocation(GetLocalObject(oCurrent, "SpawnedBy"))) > 3.0) {
if (d2() == 2) {
if (GetDistanceBetween(oNearest, oCurrent) > 5.0) {
AssignCommand(oCurrent, ClearAllActions());
SetLocalInt(oCurrent, "DoReturnHome", 1);
}
}
}
}
int iReturnHome = GetLocalInt(oCurrent, "DoReturnHome");
if (GetLocalInt(oNearest, "RandomWalk") &&
GetCurrentAction(oCurrent) == 65535 &&
!IsInConversation(oCurrent) && !iReturnHome) {
int iWalkRandom = 1;
int iNumDice = GetLocalInt(oNearest, "RW_NumDice");
int iDice = GetLocalInt(oNearest, "RW_Dice");
if (!iDice) {
iWalkRandom = 1;
}
else {
iWalkRandom = 0;
iWalkRandom = sp_RollDice(iNumDice, iDice);
}
if (iWalkRandom) {
int iRandWalk = GetLocalInt(oNearest, "RandomWalk");
object oCurLoc;
if (GetLocalInt(oNearest, "SpawnRemote")) {
oCurLoc = GetLocalObject(OBJECT_SELF, "RemoteSite" +
IntToString(GetLocalInt(oNearest, "SpawnRemote")));
}
else {
oCurLoc = oNearest;
}
if (iRandWalk > 1 && GetDistanceToObject(oCurLoc) > IntToFloat(iRandWalk)) {
location lRandWalk = sp_RandomLocation(oCurLoc, iRandWalk);
AssignCommand(oCurrent, ActionMoveToLocation(lRandWalk));
}
else {
AssignCommand(oCurrent, ActionRandomWalk());
}
}
}
if (GetLocalInt(oNearest, "PlayAnim") && ACS_Version < 220) {
if (d2() == 1) {
int iAnim = GetLocalInt(oNearest, "PlayAnim");
string sAnim = "anim";
if (iAnim >= 10) {
sAnim += IntToString(iAnim);
}
else {
sAnim += "0" + IntToString(iAnim);
}
int iAnimToPlay = GetLocalInt(OBJECT_SELF, sAnim);
float fAnimLoop = 1.0;
if (GetLocalInt(oNearest, "AnimLoop")) {
fAnimLoop = IntToFloat(GetLocalInt(oNearest, "AnimLoop"));
}
AssignCommand(oCurrent, PlayAnimation(iAnimToPlay, 1.0, fAnimLoop));
}
}
if (GetLocalInt(oNearest, "ReturnHome") &&
GetCurrentAction(oCurrent) == 65535) {
if (!GetIsInCombat(oCurrent) && !IsInConversation(oCurrent)) {
if (GetDistanceBetween(oNearest, oCurrent) > 5.0) {
AssignCommand(oCurrent, ActionMoveToObject(oNearest));
}
else if (GetFacing(oNearest) != GetFacing(oCurrent) &&
GetLocalInt(oNearest, "AboutFace")) {
AssignCommand(oCurrent, SetFacing(GetFacing(oNearest)));
}
if (iReturnHome) {
AssignCommand(oCurrent, DeleteLocalInt(oCurrent, "DoReturnHome"));
}
}
}
if (GetLocalInt(oNearest, "RandomFacing") &&
GetCurrentAction(oCurrent) == 65535 && d2() == 1) {
int iRandomDir = Random(270);
AssignCommand(oCurrent, SetFacing(IntToFloat(iRandomDir)));
}
}
int sp_GetIsPCInArea(object oArea, object oNearest) {
// Debug
if (iDebug == 3) {
sp_Debug("sp_GetIsPCInArea");
}
int iPCInArea;
object oPC = GetFirstPC();
if (oPC != OBJECT_INVALID) {
while (oPC != OBJECT_INVALID && !iPCInArea) {
if (GetArea(oPC) == oArea) {
if (GetLocalInt(oNearest, "CheckLevel")) {
if (!sp_CheckLevel(oNearest, oPC)) {
iPCInArea = 1;
}
}
else {
iPCInArea = 1;
}
}
oPC = GetNextPC();
}
}
return iPCInArea;
}
int sp_CheckRules(int iDontSpawn, int iAlive, object oNearest) {
// Debug
if (iDebug == 3) {
sp_Debug("sp_CheckRules");
}
else if (iDebug == 2) {
sp_Debug("Found " + IntToString(iAlive) + " alive.");
}
//
// Check for time of day.
// Check how many creatures are at the spawn point.
//
int iIsValid = 1;
//
// Check for time of day.
//
if (GetLocalInt(oNearest, "SpawnDay") ||
GetLocalInt(oNearest, "SpawnNight") ||
GetLocalInt(oNearest, "DaySpawn") ||
GetLocalInt(oNearest, "HourSpawn") ||
GetLocalInt(oNearest, "KillTime") ) {
if (sp_CheckTimeOfDay(oNearest) != 1) {
iIsValid = 0;
if (iAlive) {
sp_DestroyObject(oNearest, "Creature");
if (GetLocalInt(oNearest, "IsTreasure")) {
sp_DestroyObject(oNearest, "Item");
}
if (GetLocalInt(oNearest, "Camp")) {
sp_DestroyObject(oNearest, "Camp");
SetLocalInt(oNearest, "CampExists", 0);
}
}
}
}
// Check for PC in radius (if a radius is used).
//
if (GetLocalInt(oNearest, "PC_Radius")) {
int iRD = sp_CheckDistance(oNearest);
if (iRD != 1) {
iIsValid = 0;
if (iRD != 1 && iAlive) {
sp_DestroyObject(oNearest, "Creature");
if (GetLocalInt(oNearest, "IsTreasure")) {
sp_DestroyObject(oNearest, "Item");
}
if (GetLocalInt(oNearest, "Camp")) {
sp_DestroyObject(oNearest, "Camp");
SetLocalInt(oNearest, "CampExists", 0);
}
}
}
}
//
// Check for PC in Area
if (GetLocalInt(oNearest, "PCInArea")) {
int iPCInArea = sp_GetIsPCInArea(GetArea(OBJECT_SELF), oNearest);
if (!iPCInArea) {
if (GetLocalInt(oNearest, "ResetTimer")) {
SetLocalInt(oNearest, "HasSpawned", 0);
}
iIsValid = 0;
if (iAlive) {
sp_DestroyObject(oNearest, "Creature");
if (GetLocalInt(oNearest, "IsTreasure")) {
sp_DestroyObject(oNearest, "Item");
}
if (GetLocalInt(oNearest, "Camp") && GetLocalInt(oNearest, "CampExists")) {
sp_DestroyObject(oNearest, "Camp");
SetLocalInt(oNearest, "CampExists", 0);
}
}
}
}
//
// Check for Area effect
if (iIsValid && GetLocalInt(oNearest, "AreaEffect")) {
sp_AreaEffect(oNearest);
}
// Check if the spawn is suppose to wait till all
// creatures are dead.
//
int iToSpawn;
if (GetLocalInt(oNearest, "DelaySpawn") && iAlive >= 1) {
iIsValid = 0;
}
//
// Check for missing creatures.
//
if (!GetLocalInt(oNearest, "SpawnRandomNumber") && !iDontSpawn) {
if (iAlive == GetLocalInt(oNearest, "SpawnAmount")) {
iIsValid = 0;
}
}
if (iIsValid && !GetLocalInt(oNearest, "SpawnChamp") && !iDontSpawn &&
(GetLocalInt(oNearest, "Spawning") < GetLocalInt(oNearest, "SpawnAmount"))) {
iToSpawn = sp_CreaturesToSpawn(oNearest, iAlive);
if (iToSpawn == 0) {
iIsValid = 0;
}
else if (iToSpawn == GetLocalInt(oNearest, "SpawnAmount") &&
GetLocalInt(oNearest, "HasSpawned") &&
GetLocalInt(oNearest, "StopSpawn")) {
SetLocalInt(oNearest, "SpawnDestroyed", 1);
iIsValid = 0;
}
// Debug
if (iDebug == 1) {
sp_Debug("Missing " + IntToString(iToSpawn) +
" at " + GetTag(oNearest));
}
}
//
if (GetLocalInt(oNearest, "KillSpawn")) {
iIsValid = 0;
AssignCommand(OBJECT_SELF, sp_DestroyObject(oNearest, "Creature"));
if (GetLocalInt(oNearest, "IsTreasure")) {
AssignCommand(OBJECT_SELF, sp_DestroyObject(oNearest, "Item"));
}
SetLocalInt(oNearest, "ChampHasSpawned", 0);
SetLocalInt(oNearest, "SpawnDestroyed", 1);
}
//
// Checking spawn in queue
if (iToSpawn > GetLocalInt(oNearest, "Spawning")) {
iToSpawn = iToSpawn - GetLocalInt(oNearest, "Spawning");
if (iToSpawn <= 0) {
iIsValid = 0;
if (GetLocalInt(oNearest, "ToSpawn")) {
DeleteLocalInt(oNearest, "ToSpawn");
}
}
else {
SetLocalInt(oNearest, "ToSpawn", iToSpawn);
}
}
else if (!GetLocalInt(oNearest, "Spawning")) {
iIsValid = 0;
if (GetLocalInt(oNearest, "ToSpawn")) {
DeleteLocalInt(oNearest, "ToSpawn");
}
}
return iIsValid;
}
void sp_CreateItem(object oNearest, object oLastSpawned) {
// Debug
if (iDebug == 3) {
sp_Debug("sp_CreateItem");
}
else if (iDebug == 1) {
sp_Debug("Checking Item...");
}
string sItem = "item";
int iCreateItem;
int iDice = GetLocalInt(oNearest, "CI_Dice");
int iNumDice = GetLocalInt(oNearest, "CI_NumDice");
int sItemNumber = GetLocalInt(oNearest, "CreateItem");
if (!GetLocalInt(oNearest, "ItemGroup")) {
if (sItemNumber >= 10) {
sItem += IntToString(sItemNumber);
}
else {
sItem += "0" + IntToString(sItemNumber);
}
sItem = GetLocalString(OBJECT_SELF, sItem);
}
if (!iDice) {
iCreateItem = 1;
}
else {
iCreateItem = 0;
iCreateItem = sp_RollDice(iNumDice, iDice);
}
if (iCreateItem) {
// Debug
if (iDebug == 1)
sp_Debug("Creating Item " + sItem);
if (GetLocalInt(oNearest, "ItemGroup") && !GetLocalInt(oNearest, "IG_Random")) {
int iTotalItems = sp_GetGroupTotal(oNearest, "Item");
int iItems;
for (iItems = 0; iItems < iTotalItems; iItems++) {
sItem = sp_GetGroupObject(oNearest, iTotalItems, "Item", oLastSpawned);
CreateItemOnObject(sItem, oLastSpawned);
}
}
else if (GetLocalInt(oNearest, "IG_Random")) {
int iTotalItems = sp_GetGroupTotal(oNearest, "Item");
sItem = sp_GetGroupObject(oNearest, iTotalItems, "Item", oLastSpawned);
CreateItemOnObject(sItem, oLastSpawned);
}
else {
CreateItemOnObject(sItem, oLastSpawned);
}
}
}
void sp_GetSpawnSites() {
// Debug
if (iDebug == 3) {
sp_Debug("sp_GetSpawnSites");
}
object oNearest;
int iSS;
int iSpawnSite = 1;
oNearest = GetFirstObjectInArea(GetArea(OBJECT_SELF));
while (oNearest != OBJECT_INVALID)
{
if (GetObjectType(oNearest) == 32 && !GetLocalInt(oNearest, "SpawnSite")) {
string sName = GetName(oNearest);
if (GetStringLeft(sName, 3) == "SP_") {
SetLocalObject(OBJECT_SELF, "SpawnSite" +
IntToString(iSpawnSite), oNearest);
iSpawnSite++;
SetLocalInt(oNearest, "SpawnSite", 1);
}
else if (GetStringLeft(sName, 3) == "XX_") {
iSS = StringToInt(GetSubString(sName, FindSubString(sName, "_") + 1, 2));
SetLocalObject(OBJECT_SELF, "RemoteSite" +
IntToString(iSS), oNearest);
SetLocalInt(oNearest, "SpawnSite", 1);
}
else if (GetStringLeft(sName, 2) == "XX") {
iSS = StringToInt(GetSubString(sName, 3, 2));
SetLocalObject(OBJECT_SELF, "RemoteSite" +
IntToString(iSS), oNearest);
SetLocalInt(oNearest, "SpawnSite", 1);
}
}
oNearest = GetNextObjectInArea(GetArea(OBJECT_SELF));
}
}
string sp_CheckSpawnSite(object oNearest) {
// Debug
if (iDebug == 3) {
sp_Debug("sp_CheckSpawnSite");
}
if (iDebug == 2) {
sp_Debug(GetName(oNearest));
}
// Get the Tag.
//
string sBluePrint;
if (GetLocalString(oNearest, "Tag") == "") {
SetLocalString(oNearest, "Tag", sp_CleanString(oNearest, "Tag"));
}
// Get the Blueprint.
//
if (GetLocalString(oNearest, "Blueprint") == "") {
SetLocalString(oNearest, "Blueprint",
sp_CleanString(oNearest, "Blueprint"));
sBluePrint = GetLocalString(oNearest, "Blueprint");
// Debug
if (iDebug == 1) {
sp_Debug("Blueprint = " + sBluePrint);
}
}
else {
sBluePrint = GetLocalString(oNearest, "Blueprint");
}
// Check if variables are already set.
//
if (!GetLocalInt(oNearest, "IsSpawner")) {
sp_CheckVars(oNearest, GetName(oNearest));
}
// Start of Main Procedure.
//
// We will use this to see if we should spawn or not.
int iDontSpawn;
if (sBluePrint == "" || sBluePrint == "effect") {
iDontSpawn = 1;
}
int iAlive;
if (!iDontSpawn) {
iAlive = sp_CheckObjects(oNearest);
}
int iIsValid = sp_CheckRules(iDontSpawn, iAlive, oNearest);
// Check for Champion
//
if (iIsValid && !iDontSpawn && !iAlive &&
GetLocalInt(oNearest, "ChampSpawn") &&
GetLocalInt(oNearest, "HasSpawned") &&
!GetLocalInt(oNearest, "ChampHasSpawned") &&
!GetLocalInt(oNearest, "DestroyedBySpawner") &&
!GetLocalInt(oNearest, "Spawning")) {
string sChamp = sp_SpawnChamp(oNearest);
if (sChamp != "") {
SetLocalInt(oNearest, "ToSpawn", 1);
sBluePrint = sChamp;
}
}
else if (iIsValid && GetLocalInt(oNearest, "ChampHasSpawned")) {
DeleteLocalInt(oNearest, "ChampHasSpawned");
}
// Debug
if (iDebug == 2) {
sp_Debug("Blueprint is " + sBluePrint);
}
if (iDontSpawn) {
iIsValid = 0;
if (GetLocalInt(oNearest, "IsValid")) {
DeleteLocalInt(oNearest, "IsValid");
}
}
SetLocalInt(oNearest, "IsValid", iIsValid);
return sBluePrint;
}
void sp_CreateObject(object oNearest, string sBluePrint, int iToSpawn) {
// Debug
if (iDebug == 3) {
sp_Debug("sp_CreateObject");
}
DeleteLocalInt(oNearest, "DestroyedBySpawner");
float fSpawnTime;
SetLocalInt(oNearest, "IsSpawning", 1);
int iSpawnTime;
string sSpawnTimer;
string sTimerRandom;
int iDoSpawnChamp = GetLocalInt(oNearest, "SpawnChamp");
if (GetLocalInt(oNearest, "SpawnTimer") && !iDoSpawnChamp) {
sSpawnTimer = IntToString(GetLocalInt(oNearest, "SpawnTimer"));
}
if (GetLocalInt(oNearest, "TimerIsRandom") && !iDoSpawnChamp) {
sTimerRandom = IntToString(GetLocalInt(oNearest, "TimerIsRandom"));
}
if (GetLocalInt(oNearest, "HasSpawned")) {
// Debug
if (iDebug == 1) {
sp_Debug("Timer " + sSpawnTimer +
" Random " +
sTimerRandom);
}
if (GetLocalInt(oNearest, "TimerIsRandom") && !iDoSpawnChamp) {
iSpawnTime = StringToInt(sSpawnTimer) +
Random(StringToInt(sTimerRandom));
fSpawnTime = IntToFloat(iSpawnTime);
}
else if (!iDoSpawnChamp) {
fSpawnTime = StringToFloat(sSpawnTimer);
}
}
else {
SetLocalInt(oNearest, "HasSpawned", 1);
}
// Debug
if (iDebug == 1) {
sp_Debug("Spawning " + sBluePrint +
" delayed for " + IntToString(FloatToInt(fSpawnTime)));
}
SetLocalInt(oNearest, "Spawning",
GetLocalInt(oNearest, "Spawning") + iToSpawn);
DeleteLocalInt(oNearest, "ToSpawn");
if (fSpawnTime >= 1.0) {
AssignCommand(OBJECT_SELF, DelayCommand( fSpawnTime,
sp_Spawn(oNearest, sBluePrint, iToSpawn)));
}
else {
sp_Spawn(oNearest, sBluePrint, iToSpawn);
}
}
int sp_CheckLevel(object oNearest, object oPC) {
// Debug
if (iDebug == 3) {
sp_Debug("sp_CheckLevel");
}
int iMinLevel = GetLocalInt(oNearest, "StartLevel");
int iMaxLevel = GetLocalInt(oNearest, "MaxLevel");
int iPCLevel1 = GetLevelByPosition(1, oPC);
int iPCLevel2 = GetLevelByPosition(2, oPC);
int iPCLevel3 = GetLevelByPosition(3, oPC);
int iValid;
if (iMinLevel) {
if (iPCLevel1 >= iMinLevel ||
iPCLevel2 >= iMinLevel ||
iPCLevel3 >= iMinLevel) {
iValid = 1;
}
}
if (iMaxLevel) {
if (iMaxLevel >= iPCLevel1 &&
iMaxLevel >= iPCLevel2 &&
iMaxLevel >= iPCLevel3) {
iValid = 1;
}
}
return iValid;
}
int sp_PlayerView(object oCreature) {
// Debug
if (iDebug == 3) {
sp_Debug("sp_PlayerView");
}
object oPC = GetFirstPC();
while (oPC != OBJECT_INVALID) {
if (GetObjectSeen(oCreature, oPC)) {
return 1;
}
oPC = GetNextPC();
}
return 0;
}
void sp_Debug(string sString) {
SendMessageToPC(GetFirstPC(), sString);
}
void sp_Main(object oNearest) {
int iIsValid;
int iToSpawn;
string sBluePrint = sp_CheckSpawnSite(oNearest);
if (sBluePrint == "") {
iIsValid = 0;
SetLocalInt(oNearest, "IsValid", 0);
}
else {
iIsValid = GetLocalInt(oNearest, "IsValid");
iToSpawn = GetLocalInt(oNearest, "ToSpawn");
}
// If everything is ok, spawn.
//
if (iIsValid && iToSpawn) {
AssignCommand(OBJECT_SELF, sp_CreateObject(oNearest, sBluePrint, iToSpawn));
}
}