public void CopyVariables(NWObject oSource, NWObject oCopy) { int variableCount = _nwnxObject.GetLocalVariableCount(oSource); for (int variableIndex = 0; variableIndex < variableCount - 1; variableIndex++) { LocalVariable stCurVar = _nwnxObject.GetLocalVariable(oSource, variableIndex); switch (stCurVar.Type) { case LocalVariableType.Int: oCopy.SetLocalInt(stCurVar.Key, oSource.GetLocalInt(stCurVar.Key)); break; case LocalVariableType.Float: oCopy.SetLocalFloat(stCurVar.Key, oSource.GetLocalFloat(stCurVar.Key)); break; case LocalVariableType.String: oCopy.SetLocalString(stCurVar.Key, oSource.GetLocalString(stCurVar.Key)); break; case LocalVariableType.Object: oCopy.SetLocalObject(stCurVar.Key, oSource.GetLocalObject(stCurVar.Key)); break; case LocalVariableType.Location: oCopy.SetLocalLocation(stCurVar.Key, oSource.GetLocalLocation(stCurVar.Key)); break; } } }
private static void InitializeAreaSpawns(NWArea area) { var areaSpawn = new AreaSpawn(); // Check for manually placed spawns NWObject obj = GetFirstObjectInArea(area.Object); while (obj.IsValid) { bool isSpawn = obj.ObjectType == OBJECT_TYPE_WAYPOINT && obj.GetLocalInt("IS_SPAWN") == TRUE; if (isSpawn) { int spawnType = obj.GetLocalInt("SPAWN_TYPE"); int objectType = spawnType == 0 || spawnType == OBJECT_TYPE_CREATURE ? OBJECT_TYPE_CREATURE : spawnType; int spawnTableID = obj.GetLocalInt("SPAWN_TABLE_ID"); int npcGroupID = obj.GetLocalInt("SPAWN_NPC_GROUP_ID"); string behaviourScript = obj.GetLocalString("SPAWN_BEHAVIOUR_SCRIPT"); if (string.IsNullOrWhiteSpace(behaviourScript)) { behaviourScript = obj.GetLocalString("SPAWN_BEHAVIOUR"); } string spawnResref = obj.GetLocalString("SPAWN_RESREF"); float respawnTime = obj.GetLocalFloat("SPAWN_RESPAWN_SECONDS"); string spawnRule = obj.GetLocalString("SPAWN_RULE"); int deathVFXID = obj.GetLocalInt("SPAWN_DEATH_VFX"); AIFlags aiFlags = (AIFlags)obj.GetLocalInt("SPAWN_AI_FLAGS"); bool useResref = true; // No resref specified but a table was, look in the database for a random record. if (string.IsNullOrWhiteSpace(spawnResref) && spawnTableID > 0) { // Pick a random record. var spawnObjects = DataService.SpawnObject.GetAllBySpawnTableID(spawnTableID).ToList(); int count = spawnObjects.Count; int index = count <= 0 ? 0 : RandomService.Random(count); var dbSpawn = spawnObjects[index]; if (dbSpawn != null) { spawnResref = dbSpawn.Resref; useResref = false; if (dbSpawn.NPCGroupID != null && dbSpawn.NPCGroupID > 0) { npcGroupID = Convert.ToInt32(dbSpawn.NPCGroupID); } if (!string.IsNullOrWhiteSpace(dbSpawn.BehaviourScript)) { behaviourScript = dbSpawn.BehaviourScript; } if (!string.IsNullOrWhiteSpace(dbSpawn.SpawnRule)) { spawnRule = dbSpawn.SpawnRule; } if (deathVFXID <= 0) { deathVFXID = dbSpawn.DeathVFXID; } if (aiFlags == AIFlags.None) { aiFlags = dbSpawn.AIFlags; } } } // If we found a resref, spawn the object and add it to the cache. if (!string.IsNullOrWhiteSpace(spawnResref)) { // Delay the creation so that the iteration through the area doesn't get thrown off by new entries. Location location = obj.Location; bool isInstance = area.IsInstance; ObjectSpawn newSpawn; if (useResref) { newSpawn = new ObjectSpawn(location, true, spawnResref, respawnTime); } else { newSpawn = new ObjectSpawn(location, true, spawnTableID, respawnTime); } if (npcGroupID > 0) { newSpawn.NPCGroupID = npcGroupID; } if (deathVFXID > 0) { newSpawn.DeathVFXID = deathVFXID; } if (!string.IsNullOrWhiteSpace(behaviourScript)) { newSpawn.BehaviourScript = behaviourScript; } if (!string.IsNullOrWhiteSpace(spawnRule)) { newSpawn.SpawnRule = spawnRule; } if (aiFlags == AIFlags.None) { newSpawn.AIFlags = aiFlags; } // Instance spawns are one-shot. if (isInstance) { newSpawn.Respawns = false; } if (objectType == OBJECT_TYPE_CREATURE) { areaSpawn.Creatures.Add(newSpawn); } else if (objectType == OBJECT_TYPE_PLACEABLE) { areaSpawn.Placeables.Add(newSpawn); } } } obj = GetNextObjectInArea(area.Object); } AreaSpawns.Add(area, areaSpawn); DelayCommand(1.0f, () => { SpawnResources(area, areaSpawn); }); }