private void LoadMonster(CharacterPrefab monsterPrefab, XElement element, Submarine submarine) { string[] moduleFlags = element.GetAttributeStringArray("moduleflags", null); string[] spawnPointTags = element.GetAttributeStringArray("spawnpointtags", null); ISpatialEntity spawnPos = SpawnAction.GetSpawnPos(SpawnAction.SpawnLocationType.Outpost, SpawnType.Enemy, moduleFlags, spawnPointTags, element.GetAttributeBool("asfaraspossible", false)); if (spawnPos == null) { spawnPos = submarine.GetHulls(alsoFromConnectedSubs: false).GetRandom(); } Character spawnedCharacter = Character.Create(monsterPrefab.Identifier, spawnPos.WorldPosition, ToolBox.RandomSeed(8), createNetworkEvent: false); characters.Add(spawnedCharacter); if (element.GetAttributeBool("requirekill", false)) { requireKill.Add(spawnedCharacter); } if (spawnedCharacter.Inventory != null) { characterItems.Add(spawnedCharacter, spawnedCharacter.Inventory.FindAllItems(recursive: true)); } if (submarine != null && spawnedCharacter.AIController is EnemyAIController enemyAi) { enemyAi.UnattackableSubmarines.Add(submarine); enemyAi.UnattackableSubmarines.Add(Submarine.MainSub); foreach (Submarine sub in Submarine.MainSub.DockedTo) { enemyAi.UnattackableSubmarines.Add(sub); } } }
protected override void StartMissionSpecific(Level level) { items.Clear(); #if SERVER spawnedItems.Clear(); #endif if (!string.IsNullOrEmpty(itemTag)) { var itemsToDestroy = Item.ItemList.FindAll(it => it.Submarine?.Info.Type != SubmarineType.Player && it.HasTag(itemTag)); if (!itemsToDestroy.Any()) { DebugConsole.ThrowError($"Error in mission \"{Prefab.Identifier}\". Could not find an item with the tag \"{itemTag}\"."); } else { items.AddRange(itemsToDestroy); } } if (itemConfig != null && !IsClient) { foreach (XElement element in itemConfig.Elements()) { string itemIdentifier = element.GetAttributeString("identifier", ""); if (!(MapEntityPrefab.Find(null, itemIdentifier) is ItemPrefab itemPrefab)) { DebugConsole.ThrowError("Couldn't spawn item for outpost destroy mission: item prefab \"" + itemIdentifier + "\" not found"); continue; } string[] moduleFlags = element.GetAttributeStringArray("moduleflags", null); string[] spawnPointTags = element.GetAttributeStringArray("spawnpointtags", null); ISpatialEntity spawnPoint = SpawnAction.GetSpawnPos( SpawnAction.SpawnLocationType.Outpost, SpawnType.Human | SpawnType.Enemy, moduleFlags, spawnPointTags, element.GetAttributeBool("asfaraspossible", false)); if (spawnPoint == null) { var submarine = Submarine.Loaded.Find(s => s.Info.Type == SubmarineType.Outpost) ?? Submarine.MainSub; spawnPoint = submarine.GetHulls(alsoFromConnectedSubs: false).GetRandom(); } Vector2 spawnPos = spawnPoint.WorldPosition; if (spawnPoint is WayPoint wp && wp.CurrentHull != null) { spawnPos = new Vector2( MathHelper.Clamp(wp.WorldPosition.X + Rand.Range(-200, 200), wp.CurrentHull.WorldRect.X, wp.CurrentHull.WorldRect.Right), wp.CurrentHull.WorldRect.Y - wp.CurrentHull.Rect.Height + 16.0f); } var item = new Item(itemPrefab, spawnPos, null); items.Add(item); #if SERVER spawnedItems.Add(item); #endif } } base.StartMissionSpecific(level); }
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); } }