private void LoadHuman(HumanPrefab humanPrefab, XElement element, Submarine submarine) { string[] moduleFlags = element.GetAttributeStringArray("moduleflags", null); string[] spawnPointTags = element.GetAttributeStringArray("spawnpointtags", null); ISpatialEntity spawnPos = SpawnAction.GetSpawnPos( SpawnAction.SpawnLocationType.Outpost, SpawnType.Human, moduleFlags ?? humanPrefab.GetModuleFlags(), spawnPointTags ?? humanPrefab.GetSpawnPointTags(), element.GetAttributeBool("asfaraspossible", false)); if (spawnPos == null) { spawnPos = submarine.GetHulls(alsoFromConnectedSubs: false).GetRandom(); } var characterInfo = new CharacterInfo(CharacterPrefab.HumanSpeciesName, jobPrefab: humanPrefab.GetJobPrefab(Rand.RandSync.Server), randSync: Rand.RandSync.Server); Character spawnedCharacter = Character.Create(characterInfo.SpeciesName, spawnPos.WorldPosition, ToolBox.RandomSeed(8), characterInfo, createNetworkEvent: false); if (element.GetAttributeBool("requirerescue", false)) { requireRescue.Add(spawnedCharacter); spawnedCharacter.TeamID = CharacterTeamType.FriendlyNPC; #if CLIENT GameMain.GameSession.CrewManager.AddCharacterToCrewList(spawnedCharacter); #endif } else { spawnedCharacter.TeamID = CharacterTeamType.None; } humanPrefab.InitializeCharacter(spawnedCharacter, spawnPos); humanPrefab.GiveItems(spawnedCharacter, Submarine.MainSub, Rand.RandSync.Server, createNetworkEvents: false); if (spawnPos is WayPoint wp) { spawnedCharacter.GiveIdCardTags(wp); } if (element.GetAttributeBool("requirekill", false)) { requireKill.Add(spawnedCharacter); } characters.Add(spawnedCharacter); characterItems.Add(spawnedCharacter, spawnedCharacter.Inventory.FindAllItems(recursive: true)); }
private void LoadHuman(HumanPrefab humanPrefab, XElement element, Submarine submarine) { string[] moduleFlags = element.GetAttributeStringArray("moduleflags", null); string[] spawnPointTags = element.GetAttributeStringArray("spawnpointtags", null); ISpatialEntity spawnPos = SpawnAction.GetSpawnPos( SpawnAction.SpawnLocationType.Outpost, SpawnType.Human, moduleFlags ?? humanPrefab.GetModuleFlags(), spawnPointTags ?? humanPrefab.GetSpawnPointTags(), element.GetAttributeBool("asfaraspossible", false)); if (spawnPos == null) { spawnPos = submarine.GetHulls(alsoFromConnectedSubs: false).GetRandom(); } bool requiresRescue = element.GetAttributeBool("requirerescue", false); Character spawnedCharacter = CreateHuman(humanPrefab, characters, characterItems, submarine, requiresRescue ? CharacterTeamType.FriendlyNPC : CharacterTeamType.None, spawnPos, giveTags: true); if (spawnPos is WayPoint wp) { spawnedCharacter.GiveIdCardTags(wp); } if (requiresRescue) { requireRescue.Add(spawnedCharacter); #if CLIENT GameMain.GameSession.CrewManager.AddCharacterToCrewList(spawnedCharacter); #endif } if (element.GetAttributeBool("requirekill", false)) { requireKill.Add(spawnedCharacter); } }
public void InitRound() { characters.Clear(); List <WayPoint> spawnWaypoints = null; List <WayPoint> mainSubWaypoints = WayPoint.SelectCrewSpawnPoints(characterInfos, Submarine.MainSub).ToList(); if (Level.IsLoadedOutpost) { spawnWaypoints = WayPoint.WayPointList.FindAll(wp => wp.SpawnType == SpawnType.Human && wp.Submarine == Level.Loaded.StartOutpost && wp.CurrentHull?.OutpostModuleTags != null && wp.CurrentHull.OutpostModuleTags.Contains("airlock")); while (spawnWaypoints.Count > characterInfos.Count) { spawnWaypoints.RemoveAt(Rand.Int(spawnWaypoints.Count)); } while (spawnWaypoints.Any() && spawnWaypoints.Count < characterInfos.Count) { spawnWaypoints.Add(spawnWaypoints[Rand.Int(spawnWaypoints.Count)]); } } if (spawnWaypoints == null || !spawnWaypoints.Any()) { spawnWaypoints = mainSubWaypoints; } System.Diagnostics.Debug.Assert(spawnWaypoints.Count == mainSubWaypoints.Count); for (int i = 0; i < spawnWaypoints.Count; i++) { var info = characterInfos[i]; info.TeamID = Character.TeamType.Team1; Character character = Character.Create(info, spawnWaypoints[i].WorldPosition, info.Name); if (character.Info != null) { if (!character.Info.StartItemsGiven && character.Info.InventoryData != null) { DebugConsole.AddWarning($"Error when initializing a round: character \"{character.Name}\" has not been given their initial items but has saved inventory data. Using the saved inventory data instead of giving the character new items."); } if (character.Info.InventoryData != null) { character.Info.SpawnInventoryItems(character.Inventory, character.Info.InventoryData); } else if (!character.Info.StartItemsGiven) { character.GiveJobItems(mainSubWaypoints[i]); } if (character.Info.HealthData != null) { character.Info.ApplyHealthData(character, character.Info.HealthData); } character.GiveIdCardTags(spawnWaypoints[i]); character.Info.StartItemsGiven = true; } AddCharacter(character); #if CLIENT if (IsSinglePlayer && (Character.Controlled == null || character.Info.LastControlled)) { Character.Controlled = character; } #endif } //longer delay in multiplayer to prevent the server from triggering NPC conversations while the players are still loading the round conversationTimer = IsSinglePlayer ? Rand.Range(5.0f, 10.0f) : Rand.Range(45.0f, 60.0f); }