Example #1
0
        /*****************************
        ** Console Command Handlers
        ******************************/

        /// <summary>Handles commands for the SMAPI console</summary>
        internal void OnCommandReceived(string command, string[] args)
        {
            switch (command)
            {
            case "debug_asreset":
                if (!EnforceArgCount(args, 0))
                {
                    return;
                }

                ModEntry.SkinMap              = new Dictionary <long, int>();
                ModEntry.IDToCategory         = new Dictionary <long, ModEntry.CreatureCategory>();
                ModEntry.AnimalLongToShortIDs = new Dictionary <long, int>();
                ModEntry.AnimalShortToLongIDs = new Dictionary <int, long>();
                foreach (Pet pet in ModApi.GetPets())
                {
                    pet.Manners = 0;
                }
                foreach (Horse horse in ModApi.GetHorses())
                {
                    horse.Manners = 0;
                }

                // Re-add all creatures
                foreach (Pet pet in ModApi.GetPets())
                {
                    Earth.AddCreature(pet);
                }
                foreach (Horse horse in ModApi.GetHorses())
                {
                    Earth.AddCreature(horse, 0, Game1.MasterPlayer);
                }
                foreach (FarmAnimal animal in ModApi.GetAnimals())
                {
                    Earth.AddCreature(animal);
                }
                ModEntry.SMonitor.Log("All creatures have be readded into the A&S system. This has randomized all skins. Strays and wild horses have been unaffected.", LogLevel.Info);
                return;


            case "debug_idmaps":
                if (!EnforceArgCount(args, 0))
                {
                    return;
                }
                ModEntry.SMonitor.Log($"Animals Long to Short:\n{string.Join("\n", ModEntry.AnimalLongToShortIDs)}", LogLevel.Info);
                ModEntry.SMonitor.Log($"Animals Short to Long equal length: {ModEntry.AnimalLongToShortIDs.Count == ModEntry.AnimalShortToLongIDs.Count}", LogLevel.Info);
                return;


            case "debug_skinmaps":
                if (!EnforceArgCount(args, 0))
                {
                    return;
                }
                ModEntry.SMonitor.Log($"{string.Join("\n", ModEntry.SkinMap)}", LogLevel.Info);
                return;


            case "debug_pets":
                if (!EnforceArgCount(args, 0))
                {
                    return;
                }
                foreach (Pet pet in ModApi.GetAllPets())
                {
                    int petSkin = 0;
                    if (ModApi.IsStray(pet))
                    {
                        petSkin = ModEntry.Creator.StrayInfo.SkinID;
                    }
                    else if (ModApi.IsInDatabase(pet))
                    {
                        petSkin = ModEntry.SkinMap[pet.Manners];
                    }

                    ModEntry.SMonitor.Log($"[{pet.Name}] | Manners: {pet.Manners} | Skin: {petSkin} | Stray: {pet.Manners == Stray.StrayID}", LogLevel.Info);
                }
                return;


            case "debug_horses":
                if (!EnforceArgCount(args, 0))
                {
                    return;
                }

                foreach (Horse horse in ModApi.GetAllHorses())
                {
                    int horseSkin = 0;
                    if (ModApi.IsWildHorse(horse))
                    {
                        horseSkin = ModEntry.Creator.HorseInfo.SkinID;
                    }
                    else if (ModApi.IsInDatabase(horse))
                    {
                        horseSkin = ModEntry.SkinMap[horse.Manners];
                    }

                    ModEntry.SMonitor.Log($"[{horse.Name}] | Manners: {horse.Manners} | Skin: {horseSkin} | Wild: {horse.Manners == WildHorse.WildID}", LogLevel.Info);
                }
                return;


            case "summon_stray":
                if (!EnforceArgCount(args, 0))
                {
                    return;
                }

                // Get rid of any previous stray still on the map
                if (ModEntry.Creator.StrayInfo != null)
                {
                    ModEntry.Creator.StrayInfo.RemoveFromWorld();
                }
                // Create a gosh darn new stray
                ModEntry.Creator.StrayInfo = new Stray();
                return;


            case "summon_horse":
                if (!EnforceArgCount(args, 0))
                {
                    return;
                }

                // Get rid of any previous horse still on the map
                if (ModEntry.Creator.HorseInfo != null)
                {
                    ModEntry.Creator.HorseInfo.RemoveFromWorld();
                }
                // Create a gosh darn new horse
                ModEntry.Creator.HorseInfo = new WildHorse();
                return;


            case "debug_clearunowned":
                if (!EnforceArgCount(args, 0))
                {
                    return;
                }

                ModApi.ClearUnownedPets();
                return;


            // Expected arguments: <creature ID>
            case "debug_find":
                // Enforce argument constraints
                if (!EnforceArgCount(args, 1) ||
                    !EnforceArgTypeInt(args[0], 1))
                {
                    return;
                }

                Character creatureToFind = ModEntry.GetCreatureFromShortID(int.Parse(args[0]));
                if (creatureToFind != null)
                {
                    ModEntry.SMonitor.Log($"{creatureToFind.Name} located at: {creatureToFind.currentLocation} | {creatureToFind.getTileX()}, {creatureToFind.getTileY()}", LogLevel.Info);
                }
                else
                {
                    ModEntry.SMonitor.Log($"No creature exists with the given ID: {args[0]}", LogLevel.Error);
                }
                return;


            case "horse_whistle":
                if (args.ToList().Count == 1)
                {
                    // Enforce argument constraints
                    if (!EnforceArgTypeInt(args[0], 1))
                    {
                        return;
                    }

                    int callID = int.Parse(args[0]);
                    if (ModEntry.CallHorse(callID))
                    {
                        return;
                    }
                    // Horse with given ID wasn't found
                    ModEntry.SMonitor.Log($"No horse exists with the given ID: {callID}", LogLevel.Error);
                }
                else
                {
                    // Enforce argument constraints
                    if (!EnforceArgCount(args, 0))
                    {
                        return;
                    }

                    // Call the first horse found
                    ModEntry.CallHorse();
                }
                return;


            case "corral_horses":
                ModEntry.CorralHorses();
                return;


            case "sell":
                // Enforce argument constraints
                if (!EnforceArgCount(args, 1) ||
                    !EnforceArgTypeInt(args[0], 1))
                {
                    return;
                }

                Character sellCreature = ModEntry.GetCreatureFromShortID(int.Parse(args[0]));
                if (sellCreature == null)
                {
                    ModEntry.SMonitor.Log($"No creature exists with the given ID: {args[0]}", LogLevel.Error);
                    return;
                }
                else if ((sellCreature is Pet || sellCreature is Horse) && !ModApi.IsStray(sellCreature) && !ModApi.IsWildHorse(sellCreature))
                {
                    Game1.activeClickableMenu = new ConfirmationDialog($"Are you sure you want to sell your {ModApi.GetInternalType(sellCreature)}, {sellCreature.Name}?", (who) =>
                    {
                        if (Game1.activeClickableMenu is StardewValley.Menus.ConfirmationDialog cd)
                        {
                            cd.cancel();
                        }

                        Earth.RemoveCreature(ModEntry.GetLongID(sellCreature));
                        Game1.removeThisCharacterFromAllLocations((NPC)sellCreature);
                        return;
                    });
                }
                else
                {
                    ModEntry.SMonitor.Log("You may only sell pets and horses via the A&S console. The ID given is for a farm animal or an unknown type of creature.", LogLevel.Error);
                }

                return;


            // Expected arguments: <creature ID> <string name>
            case "rename":
                if (!EnforceArgCount(args, 2) ||
                    !EnforceArgTypeInt(args[0], 1))
                {
                    return;
                }

                int       idToName       = int.Parse(args[0]);
                Character creatureToName = EnforceIdAndGetCreature(idToName);

                if (creatureToName == null)
                {
                    return;
                }

                string oldName = creatureToName.Name;
                creatureToName.Name        = args[1];
                creatureToName.displayName = args[1];
                // Rename the horseName field if the original horse is being renamed.
                if (creatureToName is Horse horseToName && oldName == Game1.player.horseName.ToString())
                {
                    Game1.player.horseName.Set(args[1]);
                }
                ModEntry.SMonitor.Log($"{oldName} (ID {idToName}) has been renamed to {args[1]}", LogLevel.Info);

                return;


            // Expected arguments: <creature type/category/group>
            case "list_creatures":
                // Enforce argument constraints
                if (!EnforceArgCount(args, 1) ||
                    !EnforceArgTypeGroup(args[0]))
                {
                    return;
                }

                PrintRequestedCreatures(ModEntry.Sanitize(args[0]));
                return;


            // Expected arguments: None.
            case "randomize_all_skins":
                // Enforce argument constraints
                if (!EnforceArgCount(args, 0))
                {
                    return;
                }

                // Randomize all skins
                foreach (Pet pet in ModApi.GetPets())
                {
                    ModEntry.RandomizeSkin(pet);
                }
                foreach (Horse horse in ModApi.GetHorses())
                {
                    ModEntry.RandomizeSkin(horse);
                }
                foreach (FarmAnimal animal in ModApi.GetAnimals())
                {
                    ModEntry.RandomizeSkin(animal);
                }

                ModEntry.SMonitor.Log("All animal, pet, and horse skins have been randomized.", LogLevel.Info);
                return;


            // Expected arguments: <creature group or creature ID>
            case "randomize_skin":
                // Enforce argument constraints
                if (!EnforceArgCount(args, 1))
                {
                    return;
                }

                string call = ModEntry.Sanitize(args[0]);
                if (CreatureGroups.Contains(call) || ModApi.GetHandledAllTypes().Contains(call))
                {
                    List <Character> group = GetCreaturesFromGroup(call);
                    foreach (Character creature in group)
                    {
                        ModEntry.RandomizeSkin(creature);
                    }

                    ModEntry.SMonitor.Log($"All creatures in group `{call}` have been randomized.", LogLevel.Info);
                }
                else if (EnforceArgTypeInt(args[0], 1))
                {
                    // Find associated creature instance
                    int       creatureID = int.Parse(args[0]);
                    Character creature   = EnforceIdAndGetCreature(creatureID);

                    if (creature == null)
                    {
                        return;
                    }

                    // A creature was able to be located with the given category and ID
                    if (ModApi.IsInDatabase(creature))
                    {
                        if (ModEntry.RandomizeSkin(creature) == 0)
                        {
                            ModEntry.SMonitor.Log($"No skins are located in `/assets/skins` for {creature.Name}'s type: {ModEntry.Sanitize(creature.GetType().Name)}", LogLevel.Error);
                        }
                        else
                        {
                            ModEntry.SMonitor.Log($"{creature.Name}'s skin has been randomized.", LogLevel.Info);
                        }
                    }
                }
                return;


            // Expected arguments: <skin ID>, <creature ID>
            case "set_skin":
                // Enforce argument constraints
                if (!EnforceArgCount(args, 2) ||
                    !EnforceArgTypeInt(args[0], 1) ||
                    !EnforceArgTypeInt(args[1], 2))
                {
                    return;
                }

                int       skinID         = int.Parse(args[0]);
                int       shortID        = int.Parse(args[1]);
                Character creatureToSkin = EnforceIdAndGetCreature(shortID);

                if (creatureToSkin == null)
                {
                    return;
                }

                // Enforce argument range to the range of the available skins for this creature's type
                if (!ModEntry.Assets[ModApi.GetInternalType(creatureToSkin)].ContainsKey(skinID))
                {
                    ModEntry.SMonitor.Log($"{creatureToSkin.Name}'s type ({ModApi.GetInternalType(creatureToSkin)}) has no skin with ID {skinID}", LogLevel.Error);
                    return;
                }

                // Successfully found given creature to set skin for
                ModEntry.SetSkin(creatureToSkin, skinID);
                ModEntry.SMonitor.Log($"{creatureToSkin.Name}'s skin has been set to skin {skinID}", LogLevel.Info);
                return;


            default:
                return;
            }
        }
Example #2
0
        /*****************************
        ** Console Command Handlers
        ******************************/

        /// <summary>Handles commands for the SMAPI console</summary>
        internal void OnCommandReceived(string command, string[] args)
        {
            switch (command)
            {
            case "debug_reset":
                if (!EnforceArgCount(args, 0))
                {
                    break;
                }

                ModEntry.AnimalSkinMap = new Dictionary <long, int>();
                ModEntry.PetSkinMap    = new Dictionary <long, int>();
                ModEntry.HorseSkinMap  = new Dictionary <long, int>();

                ModEntry.AnimalLongToShortIDs = new Dictionary <long, int>();
                ModEntry.AnimalShortToLongIDs = new Dictionary <int, long>();

                foreach (Horse horse in ModEntry.GetHorses())
                {
                    if (horse.Manners != WildHorse.WildID)
                    {
                        horse.Manners = 0;
                    }
                }
                foreach (Pet pet in ModEntry.GetPets())
                {
                    if (pet.Manners != Stray.StrayID)
                    {
                        pet.Manners = 0;
                    }
                }

                foreach (Horse horse in ModEntry.GetHorses())
                {
                    if (horse.Manners != WildHorse.WildID)
                    {
                        Earth.AddCreature(horse);
                    }
                }
                foreach (Pet pet in ModEntry.GetPets())
                {
                    if (pet.Manners != Stray.StrayID)
                    {
                        Earth.AddCreature(pet);
                    }
                }
                foreach (FarmAnimal animal in ModEntry.GetAnimals())
                {
                    Earth.AddCreature(animal);
                }


                break;


            case "debug_idmaps":
                if (!EnforceArgCount(args, 0))
                {
                    break;
                }

                ModEntry.SMonitor.Log($"Animals Long to Short:\n{string.Join("\n", ModEntry.AnimalLongToShortIDs)}", LogLevel.Info);
                ModEntry.SMonitor.Log($"Animals Short to Long equal length: {ModEntry.AnimalLongToShortIDs.Count == ModEntry.AnimalShortToLongIDs.Count}", LogLevel.Alert);
                break;


            case "debug_skinmaps":
                if (!EnforceArgCount(args, 0))
                {
                    break;
                }

                ModEntry.SMonitor.Log($"Animals:\n{string.Join("\n", ModEntry.AnimalSkinMap)}", LogLevel.Info);
                ModEntry.SMonitor.Log($"Pets:\n{string.Join("\n", ModEntry.PetSkinMap)}", LogLevel.Alert);
                ModEntry.SMonitor.Log($"Horses:\n{string.Join("\n", ModEntry.HorseSkinMap)}", LogLevel.Info);
                break;


            case "debug_pets":
                if (!EnforceArgCount(args, 0))
                {
                    break;
                }

                foreach (NPC npc in Utility.getAllCharacters())
                {
                    if (npc is Pet pet)
                    {
                        int petSkin = 0;
                        if (pet.Manners == Stray.StrayID)
                        {
                            petSkin = ModEntry.Creator.StrayInfo.SkinID;
                        }
                        else if (ModEntry.HorseSkinMap.ContainsKey(pet.Manners))
                        {
                            petSkin = ModEntry.HorseSkinMap[pet.Manners];
                        }

                        ModEntry.SMonitor.Log($"[{pet.Name}] | Manners: {pet.Manners} | Skin: {petSkin} | Stray: {pet.Manners == Stray.StrayID}", LogLevel.Info);
                    }
                }
                break;


            case "debug_horses":
                if (!EnforceArgCount(args, 0))
                {
                    break;
                }

                foreach (NPC npc in Utility.getAllCharacters())
                {
                    if (npc is Horse horse)
                    {
                        int horseSkin = 0;
                        if (horse.Manners == WildHorse.WildID)
                        {
                            horseSkin = ModEntry.Creator.HorseInfo.SkinID;
                        }
                        else if (ModEntry.HorseSkinMap.ContainsKey(horse.Manners))
                        {
                            horseSkin = ModEntry.HorseSkinMap[horse.Manners];
                        }

                        ModEntry.SMonitor.Log($"[{horse.Name}] | Manners: {horse.Manners} | Skin: {horseSkin} | Wild: {horse.Manners == WildHorse.WildID}", LogLevel.Info);
                    }
                }
                break;


            case "summon_stray":
                if (!EnforceArgCount(args, 0))
                {
                    break;
                }

                // Get rid of any previous stray still on the map
                if (ModEntry.Creator.StrayInfo != null)
                {
                    ModEntry.Creator.StrayInfo.RemoveFromWorld();
                }
                // Create a gosh darn new stray
                ModEntry.Creator.StrayInfo = new Stray();
                break;


            case "summon_horse":
                if (!EnforceArgCount(args, 0))
                {
                    break;
                }

                // Get rid of any previous horse still on the map
                if (ModEntry.Creator.HorseInfo != null)
                {
                    ModEntry.Creator.HorseInfo.RemoveFromWorld();
                }
                // Create a gosh darn new horse
                ModEntry.Creator.HorseInfo = new WildHorse();
                break;


            case "debug_clearunowned":
                if (!EnforceArgCount(args, 0))
                {
                    break;
                }

                foreach (NPC npc in Utility.getAllCharacters())
                {
                    if (npc is Horse horse && horse.Manners == WildHorse.WildID)
                    {
                        Game1.removeThisCharacterFromAllLocations(horse);
                    }
                    if (npc is Pet pet && pet.Manners == Stray.StrayID)
                    {
                        Game1.removeThisCharacterFromAllLocations(pet);
                    }
                }
                break;


            // Expected arguments: <horse ID>
            case "debug_find":
                // Enforce argument constraints
                if (!EnforceArgCount(args, 2) ||
                    !EnforceArgTypeCategory(args[0], 1) ||
                    !EnforceArgTypeInt(args[1], 2))
                {
                    break;
                }

                string cat = ModEntry.Sanitize(args[0]);
                int    id  = int.Parse(args[1]);

                switch (cat)
                {
                case "horse":
                    foreach (Horse horse in ModEntry.GetHorses())
                    {
                        if (horse.Manners == id)
                        {
                            ModEntry.SMonitor.Log($"{horse.Name} located at: {horse.currentLocation} | {horse.getTileX()}, {horse.getTileY()}", LogLevel.Alert);
                        }
                    }
                    break;

                case "pet":
                    foreach (Pet pet in ModEntry.GetPets())
                    {
                        if (pet.Manners == id)
                        {
                            ModEntry.SMonitor.Log($"{pet.Name} located at: {pet.currentLocation} | {pet.getTileX()}, {pet.getTileY()}", LogLevel.Alert);
                        }
                    }
                    break;

                case "animal":
                    foreach (FarmAnimal animal in ModEntry.GetAnimals())
                    {
                        if (ModEntry.AnimalLongToShortIDs[animal.myID.Value] == id)
                        {
                            ModEntry.SMonitor.Log($"{animal.Name} located at: {animal.currentLocation} | {animal.getTileX()}, {animal.getTileY()}", LogLevel.Alert);
                        }
                    }
                    break;

                default:
                    break;
                }

                break;


            case "horse_whistle":
                if (args.ToList().Count == 1)
                {
                    // Enforce argument constraints
                    if (!EnforceArgTypeInt(args[0], 1))
                    {
                        break;
                    }

                    int callID = int.Parse(args[0]);
                    foreach (Horse horse in ModEntry.GetHorses())
                    {
                        if (horse.Manners == callID)
                        {
                            Game1.warpCharacter(horse, Game1.player.currentLocation, Game1.player.getTileLocation());
                            return;
                        }
                    }
                    // Horse with given ID wasn't found
                    ModEntry.SMonitor.Log($"No horse exists with the given ID: {callID}", LogLevel.Error);
                }
                else
                {
                    // Enforce argument constraints
                    if (!EnforceArgCount(args, 0))
                    {
                        break;
                    }

                    // Call the first horse found
                    ModEntry.CallHorse();
                }
                break;


            case "corral_horses":
                ModEntry.CorralHorses();
                break;


            case "sell":
                // Enforce argument constraints
                if (!EnforceArgCount(args, 2))
                {
                    break;
                }
                if (!EnforceArgTypeCategory(args[0], 1))
                {
                    break;
                }
                if (!EnforceArgTypeInt(args[1], 2))
                {
                    break;
                }


                string type   = ModEntry.Sanitize(args[0]);
                int    sellID = int.Parse(args[1]);
                ModEntry.CreatureCategory sellCategory = ModEntry.CreatureCategory.Animal;
                if (type == "horse")
                {
                    if (!ModEntry.HorseSkinMap.ContainsKey(sellID))
                    {
                        ModEntry.SMonitor.Log($"Horse with the given ID does not exist: {sellID}", LogLevel.Error);
                        return;
                    }
                    sellCategory = ModEntry.CreatureCategory.Horse;
                }
                else if (type == "pet")
                {
                    if (!ModEntry.PetSkinMap.ContainsKey(sellID))
                    {
                        ModEntry.SMonitor.Log($"Pet with the given ID does not exist: {sellID}", LogLevel.Error);
                        return;
                    }
                    sellCategory = ModEntry.CreatureCategory.Pet;
                }
                else
                {
                    ModEntry.SMonitor.Log("Go sell that somewhere else.", LogLevel.Error);
                    return;
                }

                if (sellCategory != ModEntry.CreatureCategory.Animal)
                {
                    Character sellCreature = ModEntry.GetCreature(sellCategory, sellID);
                    Game1.activeClickableMenu = new ConfirmationDialog($"Are you sure you want to sell your {ModEntry.Sanitize(sellCreature.GetType().Name)}, {sellCreature.Name}?", (who) =>
                    {
                        if (Game1.activeClickableMenu is StardewValley.Menus.ConfirmationDialog cd)
                        {
                            cd.cancel();
                        }

                        Earth.RemoveCreature(sellCategory, sellID);
                        Game1.removeThisCharacterFromAllLocations((NPC)sellCreature);
                    });
                }

                break;


            // Expected arguments: <creature type/category/group>
            case "list_creatures":
                // Enforce argument constraints
                if (!EnforceArgCount(args, 1) ||
                    !EnforceArgTypeGroup(args[0]))
                {
                    break;
                }

                PrintRequestedCreatures(ModEntry.Sanitize(args[0]));
                break;


            // Expected arguments: None.
            case "randomize_all_skins":
                // Enforce argument constraints
                if (!EnforceArgCount(args, 0))
                {
                    break;
                }

                // Randomize all skins
                foreach (Horse horse in ModEntry.GetHorses())
                {
                    Earth.SetRandomSkin(horse);
                }
                foreach (Pet pet in ModEntry.GetPets())
                {
                    Earth.SetRandomSkin(pet);
                }
                foreach (FarmAnimal animal in ModEntry.GetAnimals())
                {
                    Earth.SetRandomSkin(animal);
                }

                ModEntry.SMonitor.Log("All animal, pet, and horse skins have been randomized.", LogLevel.Alert);
                break;


            // Expected arguments: <creature category>, <creature ID>
            case "randomize_skin":
                // Enforce argument constraints
                if (!EnforceArgCount(args, 2))
                {
                    break;
                }
                if (!EnforceArgTypeCategory(args[0], 1) || !EnforceArgTypeInt(args[1], 2))
                {
                    break;
                }

                string    category   = ModEntry.Sanitize(args[0]);
                int       creatureID = int.Parse(args[1]);
                Character creature   = null;

                // Find associated creature instance
                if (category == "horse" && ModEntry.HorseSkinMap.ContainsKey(creatureID))
                {
                    creature = ModEntry.GetCreature(ModEntry.CreatureCategory.Horse, creatureID);
                }
                else if (category == "pet" && ModEntry.PetSkinMap.ContainsKey(creatureID))
                {
                    creature = ModEntry.GetCreature(ModEntry.CreatureCategory.Pet, creatureID);
                }
                else if (category == "animal" && ModEntry.AnimalShortToLongIDs.ContainsKey(creatureID))
                {
                    creature = ModEntry.GetCreature(ModEntry.CreatureCategory.Animal, ModEntry.AnimalShortToLongIDs[creatureID]);
                }


                // A creature was able to be located with the given category and ID
                if (creature != null)
                {
                    int newSkin = Earth.SetRandomSkin(creature);
                    if (newSkin == 0)
                    {
                        ModEntry.SMonitor.Log($"No skins are located in `/assets/skins` for {creature.Name}'s type: {ModEntry.Sanitize(creature.GetType().Name)}", LogLevel.Error);
                    }
                    else
                    {
                        ModEntry.SMonitor.Log($"{creature.Name}'s skin has been randomized.", LogLevel.Alert);
                    }
                }
                else
                {
                    ModEntry.SMonitor.Log($"Creature category `{category}` with given ID does not exist: {creatureID}", LogLevel.Error);
                }


                break;


            // Expected arguments: <skin ID>, <creature category>, <creature ID>
            case "set_skin":
                // Enforce argument constraints
                if (!EnforceArgCount(args, 3))
                {
                    break;
                }
                if (!EnforceArgTypeInt(args[0], 1) || !EnforceArgTypeCategory(args[1], 2) || !EnforceArgTypeInt(args[2], 3))
                {
                    break;
                }

                int       skinID         = int.Parse(args[0]);
                string    creatureCat    = ModEntry.Sanitize(args[1]);
                int       shortID        = int.Parse(args[2]);
                Character creatureToSkin = null;

                if (creatureCat == "horse" && ModEntry.HorseSkinMap.ContainsKey(shortID))
                {
                    creatureToSkin = ModEntry.GetCreature(ModEntry.CreatureCategory.Horse, shortID);

                    // Ensure that the skin ID given exists in Adopt & Skin
                    if (!EnforceArgRange(skinID, ModEntry.HorseAssets[ModEntry.Sanitize(creatureToSkin.GetType().Name)].Count, 1))
                    {
                        break;
                    }

                    // Set skin
                    ModEntry.HorseSkinMap[shortID] = skinID;
                }
                else if (creatureCat == "pet" && ModEntry.PetSkinMap.ContainsKey(shortID))
                {
                    creatureToSkin = ModEntry.GetCreature(ModEntry.CreatureCategory.Pet, shortID);

                    // Ensure that the skin ID given exists in Adopt & Skin
                    if (!EnforceArgRange(skinID, ModEntry.PetAssets[ModEntry.Sanitize(creatureToSkin.GetType().Name)].Count, 1))
                    {
                        break;
                    }

                    // Set skin
                    ModEntry.PetSkinMap[shortID] = skinID;
                }
                else if (creatureCat == "animal" && ModEntry.AnimalShortToLongIDs.ContainsKey(shortID))
                {
                    FarmAnimal animal = ModEntry.GetCreature(ModEntry.CreatureCategory.Animal, ModEntry.AnimalShortToLongIDs[shortID]) as FarmAnimal;
                    creatureToSkin = animal;

                    // Ensure that the skin ID given exists in Adopt & Skin
                    if (!EnforceArgRange(skinID, ModEntry.AnimalAssets[ModEntry.Sanitize(animal.type.Value)].Count, 1))
                    {
                        break;
                    }

                    // Set skin
                    ModEntry.AnimalSkinMap[ModEntry.AnimalShortToLongIDs[shortID]] = skinID;
                }


                // Successfully found given creature to set skin for. Run a skin update.
                if (creatureToSkin != null)
                {
                    Earth.UpdateSkin(creatureToSkin);
                    ModEntry.SMonitor.Log($"{creatureToSkin.Name}'s skin has been set to skin {skinID}", LogLevel.Alert);
                }
                else
                {
                    ModEntry.SMonitor.Log($"Skin setting error. Creature category {creatureCat} ID {shortID} could not be given skin {skinID}", LogLevel.Error);
                }

                break;


            default:
                break;
            }
        }