/***************************** ** 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; } }
/***************************** ** Console Command Handlers ******************************/ /// <summary>Handles commands for the SMAPI console</summary> internal void OnCommandReceived(string command, string[] args) { switch (command) { case "debug_idmaps": 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": 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_manners": ModEntry.SMonitor.Log("Horse manners:", LogLevel.Alert); foreach (Horse horse in ModEntry.GetHorses()) { ModEntry.SMonitor.Log($"#{horse.Name}: {horse.Manners}", LogLevel.Info); } ModEntry.SMonitor.Log("Pet manners:", LogLevel.Alert); foreach (Pet pet in ModEntry.GetPets()) { ModEntry.SMonitor.Log($"#{pet.Name}: {pet.Manners}", LogLevel.Info); } break; case "debug_horses": if (!EnforceArgCount(args, 0)) { break; } foreach (NPC npc in Utility.getAllCharacters()) { if (npc is Horse horse) { ModEntry.SMonitor.Log($"Horse. Manners: {horse.Manners}", LogLevel.Info); } } break; case "adopt_pet": Earth.Creator.AdoptPet(); break; case "summon_horse": Earth.Creator.NewWildHorse(true); break; // Expected arguments: <horse ID> case "find_horse": // Enforce argument constraints if (!EnforceArgCount(args, 1) || !EnforceArgTypeInt(args[0], 1)) { break; } int id = int.Parse(args[0]); foreach (Horse horse in ModEntry.GetHorses()) { if (horse.Manners == id) { ModEntry.SMonitor.Log($"{horse.Name} located at: {horse.currentLocation}\n{horse.position.X}, {horse.position.Y}\nVector: {horse.position.Value}", LogLevel.Alert); } } break; case "corral_horses": // Find the farm's stable Stable horsehut = null; foreach (Building building in Game1.getFarm().buildings) { if (building is Stable) { horsehut = building as Stable; } } // No stable was found on the farm if (horsehut == null) { ModEntry.SMonitor.Log("NOTICE: You don't have a stable to warp to!", LogLevel.Error); break; } // WARP THEM. WARP THEM ALL. int stableX = int.Parse(horsehut.tileX.ToString()) + 1; int stableY = int.Parse(horsehut.tileY.ToString()) + 1; Vector2 stableWarp = new Vector2(stableX, stableY); foreach (Horse horse in ModEntry.GetHorses()) { if (ModEntry.HorseSkinMap.ContainsKey(horse.Manners)) { Game1.warpCharacter(horse, "farm", stableWarp); } } ModEntry.SMonitor.Log("All horses have been warped to the stable.", LogLevel.Alert); 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 Animal Skinner 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 Animal Skinner 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 Animal Skinner 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; } }