/// <summary>Load all the sprites for the new animals from the loaded content packs.</summary> public void LoadContentPacks() { // loading Json Assets early is only required on connected clients - Game1.IsClient can't be used as that doesn't get set yet - this should have no effect on host LoadJAEarly(); foreach (IContentPack contentPack in this.Helper.ContentPacks.GetOwned()) { Monitor.Log($"Loading {contentPack.Manifest.Name}"); // loop through each animal folder in the current content pack foreach (var animalFolder in Directory.GetDirectories(contentPack.DirectoryPath)) { var animalFolderSplit = animalFolder.Split(Path.DirectorySeparatorChar); var animalName = animalFolderSplit[animalFolderSplit.Length - 1]; // ensure content.json file exists if (!File.Exists(Path.Combine(animalFolder, "content.json"))) { this.Monitor.Log($"Content pack: {contentPack.Manifest.Name} >> Animal: {animalName} doesn't contain a content.json file.", LogLevel.Error); continue; } // serialize and validate content.json file AnimalData animalData = contentPack.LoadAsset <AnimalData>(Path.Combine(animalName, "content.json")); if (!animalData.IsValid(animalName)) { this.Monitor.Log($"Content.json is not valid for Content pack: {contentPack.Manifest.Name} >> Animal: {animalName}", LogLevel.Error); continue; } // loop through each sub type and add them (such as colour varients etc) List <AnimalSubType> animalSubTypes = new List <AnimalSubType>(); foreach (var type in animalData.Types) { // get sprites var sprites = new AnimalSprites( adultSpriteSheet: GetSpriteByPath(Path.Combine(animalName, "assets", $"{type.Name}.png"), contentPack), babySpriteSheet: GetSpriteByPath(Path.Combine(animalName, "assets", $"Baby {type.Name}.png"), contentPack), harvestedSpriteSheet: GetSpriteByPath(Path.Combine(animalName, "assets", $"Harvested {type.Name}.png"), contentPack), springAdultSpriteSheet: GetSpriteByPath(Path.Combine(animalName, "assets", "spring", $"{type.Name}.png"), contentPack), springHarvestedSpriteSheet: GetSpriteByPath(Path.Combine(animalName, "assets", "spring", $"Harvested {type.Name}.png"), contentPack), springBabySpriteSheet: GetSpriteByPath(Path.Combine(animalName, "assets", "spring", $"Baby {type.Name}.png"), contentPack), summerAdultSpriteSheet: GetSpriteByPath(Path.Combine(animalName, "assets", "summer", $"{type.Name}.png"), contentPack), summerHarvestedSpriteSheet: GetSpriteByPath(Path.Combine(animalName, "assets", "summer", $"Harvested {type.Name}.png"), contentPack), summerBabySpriteSheet: GetSpriteByPath(Path.Combine(animalName, "assets", "summer", $"Baby {type.Name}.png"), contentPack), fallAdultSpriteSheet: GetSpriteByPath(Path.Combine(animalName, "assets", "fall", $"{type.Name}.png"), contentPack), fallHarvestedSpriteSheet: GetSpriteByPath(Path.Combine(animalName, "assets", "fall", $"Harvested {type.Name}.png"), contentPack), fallBabySpriteSheet: GetSpriteByPath(Path.Combine(animalName, "assets", "fall", $"Baby {type.Name}.png"), contentPack), winterAdultSpriteSheet: GetSpriteByPath(Path.Combine(animalName, "assets", "winter", $"{type.Name}.png"), contentPack), winterHarvestedSpriteSheet: GetSpriteByPath(Path.Combine(animalName, "assets", "winter", $"Harvested {type.Name}.png"), contentPack), winterBabySpriteSheet: GetSpriteByPath(Path.Combine(animalName, "assets", "winter", $"Baby {type.Name}.png"), contentPack) ); // ensure sprites are valid if (!sprites.IsValid()) { this.Monitor.Log($"Sprites are not valid for Content pack: {contentPack.Manifest.Name} >> Animal: {animalName} >> Subtype: {type}", LogLevel.Error); continue; } type.Sprites = sprites; // resolve API tokens in data and validate it type.ResolveTokens(); if (!type.IsValid()) { this.Monitor.Log($"Data is not valid for Content pack: {contentPack.Manifest.Name} >> Animal: {animalName} >> Subtype: {type.Name}", LogLevel.Error); continue; } animalSubTypes.Add(type); } // ensure there were valid sub types if (animalSubTypes.Count == 0) { this.Monitor.Log($"No valid sub types for Content pack: {contentPack.Manifest.Name} >> Animal: {animalName}.\n Animal will not be added.", LogLevel.Error); continue; } // create, validate, and add the animal var animal = new Animal( name: animalName, data: animalData, shopIcon: GetSpriteByPath(Path.Combine(animalName, $"shopdisplay.png"), contentPack), subTypes: animalSubTypes ); if (!animal.IsValid()) { this.Monitor.Log($"Animal is not valid at Content pack: {contentPack.Manifest.Name} >> Animal: {animalName}", LogLevel.Error); continue; } Animals.Add(animal); // construct data string for game to use foreach (var subType in animal.SubTypes) { DataStrings.Add(subType.Name, $"{animal.Data.DaysToProduce}/{animal.Data.DaysTillMature}///{animal.Data.SoundId}//////////{subType.Sprites.HasDifferentSpriteSheetWhenHarvested()}//{animal.Data.FrontAndBackSpriteWidth}/{animal.Data.FrontAndBackSpriteHeight}/{animal.Data.SideSpriteWidth}/{animal.Data.SideSpriteHeight}/{animal.Data.FullnessDrain}/{animal.Data.HappinessDrain}//0/{animal.Data.AnimalShopInfo?.BuyPrice}/{subType.Name}/"); } } } // print all added farm animals to trace PrintAnimalData(); // invalidate farm animal cache to add the new data strings to it this.Helper.Content.InvalidateCache("Data/FarmAnimals"); }
/// <summary>Load all the sprites for the new animals from the loaded content packs.</summary> private void LoadContentPacks() { foreach (IContentPack contentPack in this.Helper.ContentPacks.GetOwned()) { Monitor.Log($"Loading {contentPack.Manifest.Name}"); // loop through each animal folder in the current content pack foreach (var animalFolder in Directory.GetDirectories(contentPack.DirectoryPath)) { var animalFolderSplit = animalFolder.Split(Path.DirectorySeparatorChar); var animalName = animalFolderSplit[animalFolderSplit.Length - 1]; // ensure content.json file exists if (!File.Exists(Path.Combine(animalFolder, "content.json"))) { this.Monitor.Log($"Content pack: {contentPack.Manifest.Name} >> Animal: {animalName} doesn't contain a content.json file.", LogLevel.Error); continue; } // serialize and validate content.json file AnimalData animalData = contentPack.LoadAsset <AnimalData>(Path.Combine(animalName, "content.json")); bool isAnimalValid = animalData.IsValid(animalName); if (!isAnimalValid) { this.Monitor.Log($"Content.json is not valid for Content pack: {contentPack.Manifest.Name} >> Animal: {animalName}", LogLevel.Error); continue; } // loop through each sub type and add them (such as colour varients etc) List <AnimalSubType> animalSubTypes = new List <AnimalSubType>(); foreach (var type in animalData.Types) { // get sprites var sprites = new AnimalSprites( adultSpriteSheet: GetSpriteByPath(Path.Combine(animalName, "assets", $"{type}.png"), contentPack), babySpriteSheet: GetSpriteByPath(Path.Combine(animalName, "assets", $"Baby {type}.png"), contentPack), harvestedSpriteSheet: GetSpriteByPath(Path.Combine(animalName, "assets", $"Harvested {type}.png"), contentPack), springAdultSpriteSheet: GetSpriteByPath(Path.Combine(animalName, "assets", "spring", $"{type}.png"), contentPack), springHarvestedSpriteSheet: GetSpriteByPath(Path.Combine(animalName, "assets", "spring", $"Harvested {type}.png"), contentPack), springBabySpriteSheet: GetSpriteByPath(Path.Combine(animalName, "assets", "spring", $"Baby {type}.png"), contentPack), summerAdultSpriteSheet: GetSpriteByPath(Path.Combine(animalName, "assets", "summer", $"{type}.png"), contentPack), summerHarvestedSpriteSheet: GetSpriteByPath(Path.Combine(animalName, "assets", "summer", $"Harvested {type}.png"), contentPack), summerBabySpriteSheet: GetSpriteByPath(Path.Combine(animalName, "assets", "summer", $"Baby {type}.png"), contentPack), fallAdultSpriteSheet: GetSpriteByPath(Path.Combine(animalName, "assets", "fall", $"{type}.png"), contentPack), fallHarvestedSpriteSheet: GetSpriteByPath(Path.Combine(animalName, "assets", "fall", $"Harvested {type}.png"), contentPack), fallBabySpriteSheet: GetSpriteByPath(Path.Combine(animalName, "assets", "fall", $"Baby {type}.png"), contentPack), winterAdultSpriteSheet: GetSpriteByPath(Path.Combine(animalName, "assets", "winter", $"{type}.png"), contentPack), winterHarvestedSpriteSheet: GetSpriteByPath(Path.Combine(animalName, "assets", "winter", $"Harvested {type}.png"), contentPack), winterBabySpriteSheet: GetSpriteByPath(Path.Combine(animalName, "assets", "winter", $"Baby {type}.png"), contentPack) ); // ensure sprites are valid if (!sprites.IsValid()) { this.Monitor.Log($"Sprites are not valid for Content pack: {contentPack.Manifest.Name} >> Animal: {animalName} >> Subtype: {type}", LogLevel.Error); continue; } // get data AnimalSubTypeData data; if (File.Exists(Path.Combine(animalFolder, "assets", $"{type} content.json"))) { data = contentPack.LoadAsset <AnimalSubTypeData>(Path.Combine(animalName, "assets", $"{type} content.json")); } else if (File.Exists(Path.Combine(animalFolder, "assets", "content.json"))) { data = contentPack.LoadAsset <AnimalSubTypeData>(Path.Combine(animalName, "assets", "content.json")); } else { this.Monitor.Log($"Content pack: {contentPack.Manifest.Name} >> Animal: {animalName} >> Type: {type} doesn't have a content.json file.", LogLevel.Error); continue; } // resolve API tokens in data and validate it data.ResolveTokens(); if (!data.IsValid(type)) { this.Monitor.Log($"Data is not valid for Content pack: {contentPack.Manifest.Name} >> Animal: {animalName} >> Subtype: {type}", LogLevel.Error); continue; } // create subtype and add to animal var animalSubType = new AnimalSubType( name: type, data: data, sprites: sprites ); animalSubTypes.Add(animalSubType); } // ensure there were valid sub types if (animalSubTypes.Count == 0) { this.Monitor.Log($"No valid sub types for Content pack: {contentPack.Manifest.Name} >> Animal: {animalName}.\n Animal will not be added.", LogLevel.Error); continue; } // create, validate, and add the animal var animal = new Animal( name: animalName, data: animalData, shopIcon: GetSpriteByPath(Path.Combine(animalName, $"shopdisplay.png"), contentPack), subTypes: animalSubTypes ); if (!animal.IsValid()) { this.Monitor.Log($"Animal is not valid at Content pack: {contentPack.Manifest.Name} >> Animal: {animalName}", LogLevel.Error); continue; } Animals.Add(animal); } } }
/// <summary>Load all the sprites for the new animals from the loaded content packs.</summary> public void LoadContentPacks() { // loading Json Assets early is only required on connected clients - Game1.IsClient can't be used as that doesn't get set yet - this should have no effect on host LoadJAEarly(); foreach (IContentPack contentPack in this.Helper.ContentPacks.GetOwned()) { Monitor.Log($"Loading {contentPack.Manifest.Name}"); // loop through each animal folder in the current content pack foreach (var animalFolder in Directory.GetDirectories(contentPack.DirectoryPath)) { var animalFolderSplit = animalFolder.Split(Path.DirectorySeparatorChar); var animalName = animalFolderSplit[animalFolderSplit.Length - 1]; // ensure content.json file exists if (!File.Exists(Path.Combine(animalFolder, "content.json"))) { this.Monitor.Log($"Content pack: {contentPack.Manifest.Name} >> Animal: {animalName} doesn't contain a content.json file.", LogLevel.Error); continue; } // serialize and validate content.json file AnimalData animalData = contentPack.LoadAsset <AnimalData>(Path.Combine(animalName, "content.json")); if (!animalData.IsValid(animalName)) { this.Monitor.Log($"Content.json is not valid for Content pack: {contentPack.Manifest.Name} >> Animal: {animalName}", LogLevel.Error); continue; } // check if a sound file exists var soundPath = Path.Combine(animalFolder, "sound.wav"); if (File.Exists(soundPath)) { using (var stream = File.OpenRead(soundPath)) animalData.SoundEffect = SoundEffect.FromStream(stream); } if (animalData.UpdatePreviousAnimal) { if (ModEntry.Instance.Api.GetAnimalByName(animalName) == null) { ModEntry.Instance.Monitor.Log($"Trying to update animal: {animalName} but the aniaml hasn't been added. Animal entry will be ignored."); continue; } UpdatePreviousAnimalEntry(animalData, contentPack, animalName); } else { AddNewAnimalEntry(animalData, contentPack, animalName); } } } // print all added farm animals to trace PrintAnimalData(); // invalidate farm animal cache to add the new data strings to it this.Helper.Content.InvalidateCache("Data/FarmAnimals"); }