public FarmAnimal RandomizeLocation(AnimalHouse animalHouse) { Building Building = animalHouse.getBuilding(); this.home = Building; this.homeLocation.Set(new Vector2((float)Building.tileX, (float)Building.tileY)); this.setRandomPosition(this.home.indoors); return(this); }
public static FarmAnimal BirthAnimal(AnimalHouse animalHouseInstance, int eggID) { FarmAnimal farmAnimal = null; // ... then hatch egg before game can. long newId = smapiHelper.Multiplayer.GetNewID(); if (ModEntry.IsCustomEgg(eggID)) { string type = "White Chicken"; if (!ModEntry.modEntry.modData.customEggsAndHatchedAnimals.ContainsKey(eggID)) { // Attempt to convert chicken eggs from old ID system eggID = ModEntry.ConvertFromOldID(eggID); } if (ModEntry.modEntry.modData.customEggsAndHatchedAnimals.ContainsKey(eggID)) { type = eggsAndHatchedAnimals[eggID]; // Allow for variants string[] splitType = type.Split(new string[] { ", " }, StringSplitOptions.None); if (splitType.Length > 1) { type = splitType[ModEntry.modEntry.rand.Next(0, splitType.Length)]; } } farmAnimal = new FarmAnimal(type, newId, (long)Game1.player.uniqueMultiplayerID); if (ModEntry.modEntry.customChickenTextures.ContainsKey(type)) { farmAnimal.type.Value = type; farmAnimal.displayType = null; farmAnimal.reloadData(); ModEntry.modEntry.ReplaceCustomAnimalSound(farmAnimal); } animalHouseInstance.incubatingEgg.X = 0; animalHouseInstance.incubatingEgg.Y = -1; animalHouseInstance.animals.Add(farmAnimal.myID, farmAnimal); animalHouseInstance.animalsThatLiveHere.Add((long)farmAnimal.myID); Building building = animalHouseInstance.getBuilding(); if (building != null) { farmAnimal.home = building; farmAnimal.homeLocation.Value = new Vector2((float)(int)((NetFieldBase <int, NetInt>)building.tileX), (float)(int)((NetFieldBase <int, NetInt>)building.tileY)); farmAnimal.setRandomPosition((GameLocation)((NetFieldBase <GameLocation, NetRef <GameLocation> >)farmAnimal.home.indoors)); } } return(farmAnimal); }
private void DayStarted(object sender, DayStartedEventArgs e) { if (!Context.IsWorldReady) { return; } _data = Helper.Data.ReadSaveData <PlayerData>(Helper.ModRegistry.ModID) ?? new PlayerData(); if (!_data.Buildings.Any()) { return; } IEnumerator <Building> enumerator = Game1.getFarm().buildings.GetEnumerator(); try { while (enumerator.MoveNext()) { Building b = enumerator.Current; if (b != null) { AnimalHouse bb = b.indoors.Value as AnimalHouse; if (bb == null) { continue; } foreach (KeyValuePair <string, bool> building in _data.Buildings) { if (building.Key.Equals(bb.uniqueName.Value)) { DoPopChange(bb.getBuilding(), showLog: true, doRestore: true); } } } } } finally { enumerator.Dispose(); } }
/// <summary>Creates an animal.</summary> /// <param name="name">The name of the animal.</param> /// <param name="type">The type of the animal.</param> /// <param name="__instance">The current <see cref="AnimalHouse"/> instance being patched.</param> /// <returns>The created <see cref="FarmAnimal"/>.</returns> private static FarmAnimal CreateAnimal(string name, string type, AnimalHouse __instance) { var multiplayer = (Multiplayer)typeof(Game1).GetField("multiplayer", BindingFlags.NonPublic | BindingFlags.Static).GetValue(null); var animal = new FarmAnimal(type, multiplayer.getNewID(), Game1.player.UniqueMultiplayerID); animal.Name = name; animal.displayName = name; animal.home = __instance.getBuilding(); animal.homeLocation.Value = new Vector2(animal.home.tileX, animal.home.tileY); animal.setRandomPosition(animal.home.indoors); var animalHome = animal.home.indoors.Value as AnimalHouse; animalHome.Animals.Add(animal.myID, animal); animalHome.animalsThatLiveHere.Add(animal.myID); return(animal); }
private static void AddNewHatchedRabbit(Farmer who, AnimalHouse animalHouse, string animalName) { long animalId = ModEntry.GetMultiplayer().getNewID(); FarmAnimal farmAnimal = new FarmAnimal("Rabbit", animalId, who.UniqueMultiplayerID); farmAnimal.Name = animalName; farmAnimal.displayName = animalName; Building building = animalHouse.getBuilding(); farmAnimal.home = building; farmAnimal.homeLocation.Value = new Vector2(building.tileX.Value, building.tileY.Value); farmAnimal.setRandomPosition(animalHouse); animalHouse.animals.Add(animalId, farmAnimal); animalHouse.animalsThatLiveHere.Add(animalId); Game1.exitActiveMenu(); }
/// <summary>Patch for Breeder newborn animals to have random starting friendship.</summary> private static void AnimalHouseAddNewHatchedAnimalPostfix(ref AnimalHouse __instance) { try { var who = Game1.getFarmer(__instance.getBuilding().owner.Value); if (!Utility.SpecificPlayerHasProfession("Rancher", who)) { return; } var a = __instance.Animals?.Values.Last(); if (a == null || a.age.Value != 0 || a.friendshipTowardFarmer.Value != 0) { return; } a.friendshipTowardFarmer.Value = new Random(__instance.GetHashCode() + a.GetHashCode()).Next(0, 200); } catch (Exception ex) { Monitor.Log($"Failed in {nameof(AnimalHouseAddNewHatchedAnimalPostfix)}:\n{ex}"); } }
public static void NewHatchedAnimalPrefix(AnimalHouse __instance, ref string name, ref string __state) { if (__instance.getBuilding() is Coop) { foreach (StardewValley.Object @object in __instance.objects.Values) { if ((bool)((NetFieldBase <bool, NetBool>)@object.bigCraftable) && @object.Name.Contains("Incubator") && (@object.heldObject.Value != null && (int)((NetFieldBase <int, NetIntDelta>)@object.minutesUntilReady) <= 0) && !__instance.isFull()) { FarmAnimal farmAnimal = ModEntry.BirthAnimal(__instance, @object.heldObject.Value.ParentSheetIndex); if (farmAnimal != null) { farmAnimal.Name = name; farmAnimal.displayName = name; @object.heldObject.Value = (StardewValley.Object)null; @object.ParentSheetIndex = 101; __state = farmAnimal.type; } break; } } } }
public static bool AddHatchedAnimal(ref AnimalHouse __instance, ref string name) { if (__instance.getBuilding() is Coop) { foreach (SObject obj in __instance.objects.Values) { if (obj.bigCraftable.Value && obj.Name.Contains("Incubator") && (obj.heldObject.Value != null && obj.minutesUntilReady.Value <= 0) && !__instance.isFull()) { string type = "??"; if (obj.heldObject.Value == null) { type = "White Chicken"; } else { switch (obj.heldObject.Value.ParentSheetIndex) { case 107: type = "Dinosaur"; break; case 174: case 176: type = "White Chicken"; break; case 180: case 182: type = "Brown Chicken"; break; case 305: type = "Void Chicken"; break; case 442: type = "Duck"; break; default: if (obj.heldObject.Value.ParentSheetIndex == Loader.DATA["Blue Chicken Egg"]) { type = "Blue Chicken"; } break; } } FarmAnimal farmAnimal = new FarmAnimal(type, Loader.HELPER.Multiplayer.GetNewID(), Game1.player.UniqueMultiplayerID); while ((Game1.player.eventsSeen.Contains(3900074) || !type.Equals("Blue Chicken")) && !farmAnimal.type.Value.Equals(type)) { farmAnimal = new FarmAnimal(type, farmAnimal.myID.Value, Game1.player.UniqueMultiplayerID); } farmAnimal.Name = name; farmAnimal.displayName = name; Building building = __instance.getBuilding(); farmAnimal.home = building; farmAnimal.homeLocation.Value = new Vector2(building.tileX.Value, building.tileY.Value); farmAnimal.setRandomPosition(farmAnimal.home.indoors.Value); (building.indoors.Value as AnimalHouse).animals.Add(farmAnimal.myID.Value, farmAnimal); (building.indoors.Value as AnimalHouse).animalsThatLiveHere.Add(farmAnimal.myID.Value); obj.heldObject.Value = null; obj.ParentSheetIndex = 101; break; } } } else if (Game1.farmEvent != null && Game1.farmEvent is QuestionEvent) { var qe = Game1.farmEvent as QuestionEvent; FarmAnimal farmAnimal = new FarmAnimal(qe.animal.type.Value, Loader.HELPER.Multiplayer.GetNewID(), Game1.player.UniqueMultiplayerID); farmAnimal.Name = name; farmAnimal.displayName = name; farmAnimal.parentId.Value = qe.animal.myID.Value; Building building = __instance.getBuilding(); farmAnimal.home = building; farmAnimal.homeLocation.Value = new Vector2(building.tileX.Value, building.tileY.Value); qe.forceProceed = true; farmAnimal.setRandomPosition(farmAnimal.home.indoors.Value); (building.indoors.Value as AnimalHouse).animals.Add(farmAnimal.myID.Value, farmAnimal); (building.indoors.Value as AnimalHouse).animalsThatLiveHere.Add(farmAnimal.myID.Value); } if (Game1.currentLocation.currentEvent != null) { ++Game1.currentLocation.currentEvent.CurrentCommand; } Game1.exitActiveMenu(); return(false); }
public static bool AnimalHouseToolActionExecutor(ref AnimalHouse __instance, ref Tool t, ref int tileX, ref int tileY) { GameLocation gameLocation = Game1.currentLocation; if (t.BaseName != "Watering Can" || ((WateringCan)t).WaterLeft <= 0) { return(false); } if (Game1.currentLocation.Name.ToLower().Contains("coop") && !ModData.CoopsWithWateredTrough.Contains(__instance.NameOrUniqueName.ToLower())) { Type buildingType = typeof(Coop); if (__instance.getBuilding().nameOfIndoorsWithoutUnique.ToLower() == "coop") { foreach (TroughTile troughTile in ModEntry.Instance.CurrentTroughPlacementProfile.coopTroughTiles) { if (troughTile.TileX != tileX || troughTile.TileY != tileY) { continue; } ModEntry.Instance.SendTroughWateredMessage(buildingType, __instance.NameOrUniqueName.ToLower()); foreach (TroughTile tile in ModEntry.Instance.CurrentTroughPlacementProfile.coopTroughTiles) { gameLocation.removeTile(tile.TileX, tile.TileY, tile.Layer); } Layer buildingsLayer = gameLocation.Map.GetLayer("Buildings"); Layer frontLayer = gameLocation.Map.GetLayer("Front"); TileSheet tilesheet = gameLocation.Map.GetTileSheet("z_waterTroughTilesheet"); foreach (TroughTile tile in ModEntry.Instance.CurrentTroughPlacementProfile.coopTroughTiles) { if (tile.Layer.Equals("Buildings")) { buildingsLayer.Tiles[tile.TileX, tile.TileY] = new StaticTile(buildingsLayer, tilesheet, BlendMode.Alpha, tileIndex: tile.FullIndex); } else if (tile.Layer.Equals("Front")) { frontLayer.Tiles[tile.TileX, tile.TileY] = new StaticTile(frontLayer, tilesheet, BlendMode.Alpha, tileIndex: tile.FullIndex); } } ModData.CoopsWithWateredTrough.Add(__instance.NameOrUniqueName.ToLower()); ModEntry.Instance.ChangeCoopTexture(__instance.getBuilding(), false); foreach (FarmAnimal animal in __instance.animals.Values) { if (ModEntry.Instance.Config.ShowLoveBubblesOverAnimalsWhenWateredTrough) { animal.doEmote(ModData.LoveEmote); } animal.friendshipTowardFarmer.Value += Math.Abs(ModEntry.Instance.Config.AdditionalFriendshipPointsForWateredTroughWithAnimalsInsideBuilding); } } } else if (__instance.getBuilding().nameOfIndoorsWithoutUnique.ToLower() == "coop2") { foreach (TroughTile troughTile in ModEntry.Instance.CurrentTroughPlacementProfile.coop2TroughTiles) { if (troughTile.TileX != tileX || troughTile.TileY != tileY) { continue; } ModEntry.Instance.SendTroughWateredMessage(buildingType, __instance.NameOrUniqueName.ToLower()); foreach (TroughTile tile in ModEntry.Instance.CurrentTroughPlacementProfile.coop2TroughTiles) { gameLocation.removeTile(tile.TileX, tile.TileY, tile.Layer); } Layer buildingsLayer = gameLocation.Map.GetLayer("Buildings"); Layer frontLayer = gameLocation.Map.GetLayer("Front"); TileSheet tilesheet = gameLocation.Map.GetTileSheet("z_waterTroughTilesheet"); foreach (TroughTile tile in ModEntry.Instance.CurrentTroughPlacementProfile.coop2TroughTiles) { if (tile.Layer.Equals("Buildings")) { buildingsLayer.Tiles[tile.TileX, tile.TileY] = new StaticTile(buildingsLayer, tilesheet, BlendMode.Alpha, tileIndex: tile.FullIndex); } else if (tile.Layer.Equals("Front")) { frontLayer.Tiles[tile.TileX, tile.TileY] = new StaticTile(frontLayer, tilesheet, BlendMode.Alpha, tileIndex: tile.FullIndex); } } ModData.CoopsWithWateredTrough.Add(__instance.NameOrUniqueName.ToLower()); ModEntry.Instance.ChangeBigCoopTexture(__instance.getBuilding(), false); foreach (FarmAnimal animal in __instance.animals.Values) { if (ModEntry.Instance.Config.ShowLoveBubblesOverAnimalsWhenWateredTrough) { animal.doEmote(ModData.LoveEmote); } animal.friendshipTowardFarmer.Value += Math.Abs(ModEntry.Instance.Config.AdditionalFriendshipPointsForWateredTroughWithAnimalsInsideBuilding); } } } else if (__instance.getBuilding().nameOfIndoorsWithoutUnique.ToLower() == "coop3") { foreach (TroughTile troughTile in ModEntry.Instance.CurrentTroughPlacementProfile.coop3TroughTiles) { if (troughTile.TileX != tileX || troughTile.TileY != tileY) { continue; } ModEntry.Instance.SendTroughWateredMessage(buildingType, __instance.NameOrUniqueName.ToLower()); foreach (TroughTile tile in ModEntry.Instance.CurrentTroughPlacementProfile.coop3TroughTiles) { gameLocation.removeTile(tile.TileX, tile.TileY, tile.Layer); } Layer buildingsLayer = gameLocation.Map.GetLayer("Buildings"); Layer frontLayer = gameLocation.Map.GetLayer("Front"); TileSheet tilesheet = gameLocation.Map.GetTileSheet("z_waterTroughTilesheet"); foreach (TroughTile tile in ModEntry.Instance.CurrentTroughPlacementProfile.coop3TroughTiles) { if (tile.Layer.Equals("Buildings")) { buildingsLayer.Tiles[tile.TileX, tile.TileY] = new StaticTile(buildingsLayer, tilesheet, BlendMode.Alpha, tileIndex: tile.FullIndex); } else if (tile.Layer.Equals("Front")) { frontLayer.Tiles[tile.TileX, tile.TileY] = new StaticTile(frontLayer, tilesheet, BlendMode.Alpha, tileIndex: tile.FullIndex); } } ModData.CoopsWithWateredTrough.Add(__instance.NameOrUniqueName.ToLower()); foreach (FarmAnimal animal in __instance.animals.Values) { if (ModEntry.Instance.Config.ShowLoveBubblesOverAnimalsWhenWateredTrough) { animal.doEmote(ModData.LoveEmote); } animal.friendshipTowardFarmer.Value += Math.Abs(ModEntry.Instance.Config.AdditionalFriendshipPointsForWateredTroughWithAnimalsInsideBuilding); } } } } else if (Game1.currentLocation.Name.ToLower().Contains("barn") && !ModData.BarnsWithWateredTrough.Contains(__instance.NameOrUniqueName.ToLower())) { Type buildingType = typeof(Barn); if (__instance.getBuilding().nameOfIndoorsWithoutUnique.ToLower() == "barn") { foreach (TroughTile troughTile in ModEntry.Instance.CurrentTroughPlacementProfile.barnTroughTiles) { if (troughTile.TileX != tileX || troughTile.TileY != tileY) { continue; } ModEntry.Instance.SendTroughWateredMessage(buildingType, __instance.NameOrUniqueName.ToLower()); foreach (TroughTile tile in ModEntry.Instance.CurrentTroughPlacementProfile.barnTroughTiles) { gameLocation.removeTile(tile.TileX, tile.TileY, tile.Layer); } Layer buildingsLayer = gameLocation.Map.GetLayer("Buildings"); Layer frontLayer = gameLocation.Map.GetLayer("Front"); TileSheet tilesheet = gameLocation.Map.GetTileSheet("z_waterTroughTilesheet"); foreach (TroughTile tile in ModEntry.Instance.CurrentTroughPlacementProfile.barnTroughTiles) { if (tile.Layer.Equals("Buildings")) { buildingsLayer.Tiles[tile.TileX, tile.TileY] = new StaticTile(buildingsLayer, tilesheet, BlendMode.Alpha, tileIndex: tile.FullIndex); } else if (tile.Layer.Equals("Front")) { frontLayer.Tiles[tile.TileX, tile.TileY] = new StaticTile(frontLayer, tilesheet, BlendMode.Alpha, tileIndex: tile.FullIndex); } } ModData.BarnsWithWateredTrough.Add(__instance.NameOrUniqueName.ToLower()); foreach (FarmAnimal animal in __instance.animals.Values) { if (ModEntry.Instance.Config.ShowLoveBubblesOverAnimalsWhenWateredTrough) { animal.doEmote(ModData.LoveEmote); } animal.friendshipTowardFarmer.Value += Math.Abs(ModEntry.Instance.Config.AdditionalFriendshipPointsForWateredTroughWithAnimalsInsideBuilding); } } } else if (__instance.getBuilding().nameOfIndoorsWithoutUnique.ToLower() == "barn2") { foreach (TroughTile troughTile in ModEntry.Instance.CurrentTroughPlacementProfile.barn2TroughTiles) { if (troughTile.TileX != tileX || troughTile.TileY != tileY) { continue; } ModEntry.Instance.SendTroughWateredMessage(buildingType, __instance.NameOrUniqueName.ToLower()); foreach (TroughTile tile in ModEntry.Instance.CurrentTroughPlacementProfile.barn2TroughTiles) { gameLocation.removeTile(tile.TileX, tile.TileY, tile.Layer); } Layer buildingsLayer = gameLocation.Map.GetLayer("Buildings"); Layer frontLayer = gameLocation.Map.GetLayer("Front"); TileSheet tilesheet = gameLocation.Map.GetTileSheet("z_waterTroughTilesheet"); foreach (TroughTile tile in ModEntry.Instance.CurrentTroughPlacementProfile.barn2TroughTiles) { if (tile.Layer.Equals("Buildings")) { buildingsLayer.Tiles[tile.TileX, tile.TileY] = new StaticTile(buildingsLayer, tilesheet, BlendMode.Alpha, tileIndex: tile.FullIndex); } else if (tile.Layer.Equals("Front")) { frontLayer.Tiles[tile.TileX, tile.TileY] = new StaticTile(frontLayer, tilesheet, BlendMode.Alpha, tileIndex: tile.FullIndex); } } ModData.BarnsWithWateredTrough.Add(__instance.NameOrUniqueName.ToLower()); foreach (FarmAnimal animal in __instance.animals.Values) { if (ModEntry.Instance.Config.ShowLoveBubblesOverAnimalsWhenWateredTrough) { animal.doEmote(ModData.LoveEmote); } animal.friendshipTowardFarmer.Value += Math.Abs(ModEntry.Instance.Config.AdditionalFriendshipPointsForWateredTroughWithAnimalsInsideBuilding); } } } else if (__instance.getBuilding().nameOfIndoorsWithoutUnique.ToLower() == "barn3") { foreach (TroughTile troughTile in ModEntry.Instance.CurrentTroughPlacementProfile.barn3TroughTiles) { if (troughTile.TileX != tileX || troughTile.TileY != tileY) { continue; } ModEntry.Instance.SendTroughWateredMessage(buildingType, __instance.NameOrUniqueName.ToLower()); foreach (TroughTile tile in ModEntry.Instance.CurrentTroughPlacementProfile.barn3TroughTiles) { gameLocation.removeTile(tile.TileX, tile.TileY, tile.Layer); } Layer buildingsLayer = gameLocation.Map.GetLayer("Buildings"); Layer frontLayer = gameLocation.Map.GetLayer("Front"); TileSheet tilesheet = gameLocation.Map.GetTileSheet("z_waterTroughTilesheet"); foreach (TroughTile tile in ModEntry.Instance.CurrentTroughPlacementProfile.barn3TroughTiles) { if (tile.Layer.Equals("Buildings")) { buildingsLayer.Tiles[tile.TileX, tile.TileY] = new StaticTile(buildingsLayer, tilesheet, BlendMode.Alpha, tileIndex: tile.FullIndex); } else if (tile.Layer.Equals("Front")) { frontLayer.Tiles[tile.TileX, tile.TileY] = new StaticTile(frontLayer, tilesheet, BlendMode.Alpha, tileIndex: tile.FullIndex); } } ModData.BarnsWithWateredTrough.Add(__instance.NameOrUniqueName.ToLower()); foreach (FarmAnimal animal in __instance.animals.Values) { if (ModEntry.Instance.Config.ShowLoveBubblesOverAnimalsWhenWateredTrough) { animal.doEmote(ModData.LoveEmote); } animal.friendshipTowardFarmer.Value += Math.Abs(ModEntry.Instance.Config.AdditionalFriendshipPointsForWateredTroughWithAnimalsInsideBuilding); } } } } return(false); }