//:://///////////////////////////////////////////// //:: 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 //:: 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_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_GREETING); SetLocalInt(OBJECT_SELF, "anim04", ANIMATION_FIREFORGET_HEAD_TURN_LEFT); SetLocalInt(OBJECT_SELF, "anim05", ANIMATION_FIREFORGET_HEAD_TURN_RIGHT); SetLocalInt(OBJECT_SELF, "anim06", ANIMATION_FIREFORGET_PAUSE_BORED); 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_TAUNT); 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")) 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); 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) { // 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)); } }