public void PreloadContent(IEnumerable <ContentFile> contentFiles) { var filesToPreload = new List <ContentFile>(contentFiles); foreach (Submarine sub in Submarine.Loaded) { if (sub.WreckAI == null) { continue; } if (!string.IsNullOrEmpty(sub.WreckAI.Config.DefensiveAgent)) { var prefab = CharacterPrefab.FindBySpeciesName(sub.WreckAI.Config.DefensiveAgent); if (prefab != null && !filesToPreload.Any(f => f.Path == prefab.FilePath)) { filesToPreload.Add(new ContentFile(prefab.FilePath, ContentType.Character)); } } foreach (Item item in Item.ItemList) { if (item.Submarine != sub) { continue; } foreach (Items.Components.ItemComponent component in item.Components) { if (component.statusEffectLists == null) { continue; } foreach (var statusEffectList in component.statusEffectLists.Values) { foreach (StatusEffect statusEffect in statusEffectList) { foreach (var spawnInfo in statusEffect.SpawnCharacters) { var prefab = CharacterPrefab.FindBySpeciesName(spawnInfo.SpeciesName); if (prefab != null && !filesToPreload.Any(f => f.Path == prefab.FilePath)) { filesToPreload.Add(new ContentFile(prefab.FilePath, ContentType.Character)); } } } } } } } foreach (ContentFile file in filesToPreload) { switch (file.Type) { case ContentType.Character: #if CLIENT CharacterPrefab characterPrefab = CharacterPrefab.FindByFilePath(file.Path); if (characterPrefab?.XDocument == null) { throw new Exception($"Failed to load the character config file from {file.Path}!"); } var doc = characterPrefab.XDocument; var rootElement = doc.Root; var mainElement = rootElement.IsOverride() ? rootElement.FirstElement() : rootElement; mainElement.GetChildElements("sound").ForEach(e => Submarine.LoadRoundSound(e)); if (!CharacterPrefab.CheckSpeciesName(mainElement, file.Path, out string speciesName)) { continue; } bool humanoid = mainElement.GetAttributeBool("humanoid", false); CharacterPrefab originalCharacter; if (characterPrefab.VariantOf != null) { originalCharacter = CharacterPrefab.FindBySpeciesName(characterPrefab.VariantOf); var originalRoot = originalCharacter.XDocument.Root; var originalMainElement = originalRoot.IsOverride() ? originalRoot.FirstElement() : originalRoot; originalMainElement.GetChildElements("sound").ForEach(e => Submarine.LoadRoundSound(e)); if (!CharacterPrefab.CheckSpeciesName(mainElement, file.Path, out string name)) { continue; } speciesName = name; if (mainElement.Attribute("humanoid") == null) { humanoid = originalMainElement.GetAttributeBool("humanoid", false); } } RagdollParams ragdollParams; try { if (humanoid) { ragdollParams = RagdollParams.GetRagdollParams <HumanRagdollParams>(characterPrefab.VariantOf ?? speciesName); } else { ragdollParams = RagdollParams.GetRagdollParams <FishRagdollParams>(characterPrefab.VariantOf ?? speciesName); } } catch (Exception e) { DebugConsole.ThrowError($"Failed to preload a ragdoll file for the character \"{characterPrefab.Name}\"", e); continue; } if (ragdollParams != null) { HashSet <string> texturePaths = new HashSet <string> { ragdollParams.Texture }; foreach (RagdollParams.LimbParams limb in ragdollParams.Limbs) { if (!string.IsNullOrEmpty(limb.normalSpriteParams?.Texture)) { texturePaths.Add(limb.normalSpriteParams.Texture); } if (!string.IsNullOrEmpty(limb.deformSpriteParams?.Texture)) { texturePaths.Add(limb.deformSpriteParams.Texture); } if (!string.IsNullOrEmpty(limb.damagedSpriteParams?.Texture)) { texturePaths.Add(limb.damagedSpriteParams.Texture); } foreach (var decorativeSprite in limb.decorativeSpriteParams) { if (!string.IsNullOrEmpty(decorativeSprite.Texture)) { texturePaths.Add(decorativeSprite.Texture); } } } foreach (string texturePath in texturePaths) { preloadedSprites.Add(new Sprite(texturePath, Vector2.Zero)); } } #endif break; } } }
public void PreloadContent(IEnumerable <ContentFile> contentFiles) { var filesToPreload = new List <ContentFile>(contentFiles); foreach (Submarine sub in Submarine.Loaded) { if (sub.WreckAI == null) { continue; } if (!string.IsNullOrEmpty(sub.WreckAI.Config.DefensiveAgent)) { var prefab = CharacterPrefab.FindBySpeciesName(sub.WreckAI.Config.DefensiveAgent); if (prefab != null && !filesToPreload.Any(f => f.Path == prefab.FilePath)) { filesToPreload.Add(new ContentFile(prefab.FilePath, ContentType.Character)); } } foreach (Item item in Item.ItemList) { if (item.Submarine != sub) { continue; } foreach (Items.Components.ItemComponent component in item.Components) { if (component.statusEffectLists == null) { continue; } foreach (var statusEffectList in component.statusEffectLists.Values) { foreach (StatusEffect statusEffect in statusEffectList) { foreach (var spawnInfo in statusEffect.SpawnCharacters) { var prefab = CharacterPrefab.FindBySpeciesName(spawnInfo.SpeciesName); if (prefab != null && !filesToPreload.Any(f => f.Path == prefab.FilePath)) { filesToPreload.Add(new ContentFile(prefab.FilePath, ContentType.Character)); } } } } } } } foreach (ContentFile file in filesToPreload) { switch (file.Type) { case ContentType.Character: #if CLIENT CharacterPrefab characterPrefab = CharacterPrefab.FindByFilePath(file.Path); if (characterPrefab?.XDocument == null) { throw new Exception($"Failed to load the character config file from {file.Path}!"); } var doc = characterPrefab.XDocument; var rootElement = doc.Root; var mainElement = rootElement.IsOverride() ? rootElement.FirstElement() : rootElement; foreach (var soundElement in mainElement.GetChildElements("sound")) { var sound = Submarine.LoadRoundSound(soundElement); } string speciesName = mainElement.GetAttributeString("speciesname", null); if (string.IsNullOrWhiteSpace(speciesName)) { speciesName = mainElement.GetAttributeString("name", null); if (!string.IsNullOrWhiteSpace(speciesName)) { DebugConsole.NewMessage($"Error in {file.Path}: 'name' is deprecated! Use 'speciesname' instead.", Color.Orange); } else { throw new Exception($"Species name null in {file.Path}"); } } bool humanoid = mainElement.GetAttributeBool("humanoid", false); RagdollParams ragdollParams; if (humanoid) { ragdollParams = RagdollParams.GetRagdollParams <HumanRagdollParams>(speciesName); } else { ragdollParams = RagdollParams.GetRagdollParams <FishRagdollParams>(speciesName); } if (ragdollParams != null) { HashSet <string> texturePaths = new HashSet <string> { ragdollParams.Texture }; foreach (RagdollParams.LimbParams limb in ragdollParams.Limbs) { if (!string.IsNullOrEmpty(limb.normalSpriteParams?.Texture)) { texturePaths.Add(limb.normalSpriteParams.Texture); } if (!string.IsNullOrEmpty(limb.deformSpriteParams?.Texture)) { texturePaths.Add(limb.deformSpriteParams.Texture); } if (!string.IsNullOrEmpty(limb.damagedSpriteParams?.Texture)) { texturePaths.Add(limb.damagedSpriteParams.Texture); } foreach (var decorativeSprite in limb.decorativeSpriteParams) { if (!string.IsNullOrEmpty(decorativeSprite.Texture)) { texturePaths.Add(decorativeSprite.Texture); } } } foreach (string texturePath in texturePaths) { preloadedSprites.Add(new Sprite(texturePath, Vector2.Zero)); } } #endif break; } } }
public void PreloadContent(IEnumerable <ContentFile> contentFiles) { foreach (ContentFile file in contentFiles) { switch (file.Type) { case ContentType.Character: #if CLIENT CharacterPrefab characterPrefab = CharacterPrefab.FindByFilePath(file.Path); if (characterPrefab?.XDocument == null) { throw new Exception($"Failed to load the character config file from {file.Path}!"); } var doc = characterPrefab.XDocument; var rootElement = doc.Root; var mainElement = rootElement.IsOverride() ? rootElement.FirstElement() : rootElement; foreach (var soundElement in mainElement.GetChildElements("sound")) { var sound = Submarine.LoadRoundSound(soundElement); } string speciesName = mainElement.GetAttributeString("speciesname", null); if (string.IsNullOrWhiteSpace(speciesName)) { speciesName = mainElement.GetAttributeString("name", null); if (!string.IsNullOrWhiteSpace(speciesName)) { DebugConsole.NewMessage($"Error in {file.Path}: 'name' is deprecated! Use 'speciesname' instead.", Color.Orange); } else { throw new Exception($"Species name null in {file.Path}"); } } bool humanoid = mainElement.GetAttributeBool("humanoid", false); RagdollParams ragdollParams; if (humanoid) { ragdollParams = RagdollParams.GetRagdollParams <HumanRagdollParams>(speciesName); } else { ragdollParams = RagdollParams.GetRagdollParams <FishRagdollParams>(speciesName); } if (ragdollParams != null) { HashSet <string> texturePaths = new HashSet <string> { ragdollParams.Texture }; foreach (RagdollParams.LimbParams limb in ragdollParams.Limbs) { if (!string.IsNullOrEmpty(limb.normalSpriteParams?.Texture)) { texturePaths.Add(limb.normalSpriteParams.Texture); } if (!string.IsNullOrEmpty(limb.deformSpriteParams?.Texture)) { texturePaths.Add(limb.deformSpriteParams.Texture); } if (!string.IsNullOrEmpty(limb.damagedSpriteParams?.Texture)) { texturePaths.Add(limb.damagedSpriteParams.Texture); } foreach (var decorativeSprite in limb.decorativeSpriteParams) { if (!string.IsNullOrEmpty(decorativeSprite.Texture)) { texturePaths.Add(decorativeSprite.Texture); } } } foreach (string texturePath in texturePaths) { preloadedSprites.Add(new Sprite(texturePath, Vector2.Zero)); } } #endif break; } } }