示例#1
0
        public static bool Prefix(
            ref StardewValley.FarmAnimal __instance,
            ref GameTime time,
            ref GameLocation location,
            ref bool __result)
        {
            var moddedAnimal = new Decorators.FarmAnimal(__instance);

            if (!moddedAnimal.HasHome() || moddedAnimal.IsEating() || Game1.IsClient || __instance.controller != null)
            {
                return(true);
            }
            var moddedLocation = new Location(location);

            HandleFindGrassToEat(ref moddedAnimal, ref moddedLocation);
            if (HandleNightTimeRoutine(ref moddedAnimal, ref moddedLocation))
            {
                __result = true;
            }
            else
            {
                HandleFindProduce(ref moddedAnimal, ref moddedLocation);
                __result = false;
            }

            return(false);
        }
示例#2
0
 private static void HandleFindGrassToEat(
     ref Decorators.FarmAnimal moddedAnimal,
     ref Location moddedLocation)
 {
     if (!moddedLocation.IsOutdoors() || moddedAnimal.GetFullness() >= 195 || Random.NextDouble() >= 0.002 ||
         !Paritee.StardewValley.Core.Characters.FarmAnimal.UnderMaxPathFindingPerTick())
     {
         return;
     }
     Paritee.StardewValley.Core.Characters.FarmAnimal.IncreasePathFindingThisTick();
     moddedAnimal.SetFindGrassPathController(moddedLocation.GetOriginal());
 }
示例#3
0
        private static bool HasNoImpediments(Decorators.FarmAnimal moddedAnimal, Location moddedLocation)
        {
            var boundingBox = moddedAnimal.GetBoundingBox();

            for (var corner = 0; corner < 4; ++corner)
            {
                var cornersOfThisRectangle = StardewValley.Utility.getCornersOfThisRectangle(ref boundingBox, corner);
                var key = new Vector2(cornersOfThisRectangle.X / 64f, cornersOfThisRectangle.Y / 64f);
                if (moddedLocation.GetOriginal().terrainFeatures.ContainsKey(key) ||
                    moddedLocation.GetOriginal().objects.ContainsKey(key))
                {
                    return(false);
                }
            }

            return(true);
        }
示例#4
0
        private static bool HandleNightTimeRoutine(
            ref Decorators.FarmAnimal moddedAnimal,
            ref Location moddedLocation)
        {
            if (Game.GetTimeOfDay() < 1700 || !moddedLocation.IsOutdoors() || moddedAnimal.HasController() ||
                Random.NextDouble() >= 0.002)
            {
                return(false);
            }
            if (moddedLocation.AnyFarmers())
            {
                moddedLocation.RemoveAnimal(moddedAnimal.GetOriginal());
                moddedAnimal.ReturnHome();
                return(true);
            }

            if (Paritee.StardewValley.Core.Characters.FarmAnimal.UnderMaxPathFindingPerTick())
            {
                Paritee.StardewValley.Core.Characters.FarmAnimal.IncreasePathFindingThisTick();
                moddedAnimal.SetFindHomeDoorPathController(moddedLocation.GetOriginal());
            }

            return(false);
        }
示例#5
0
 private static bool IsValidLocation(Location moddedLocation)
 {
     return(moddedLocation.IsOutdoors() && !Weather.IsRaining() && !Season.IsWinter());
 }
示例#6
0
        private static void HandleFindProduce(ref Decorators.FarmAnimal moddedAnimal, ref Location moddedLocation)
        {
            var moddedPlayer = new Farmer(Game.GetPlayer());

            if (!IsValidLocation(moddedLocation) || !CanFindProduce(moddedAnimal, moddedPlayer) ||
                Random.NextDouble() >= 0.0002 || !HasNoImpediments(moddedAnimal, moddedLocation))
            {
                return;
            }
            if (moddedPlayer.IsCurrentLocation(moddedLocation.GetOriginal()))
            {
                BellsAndWhistles.PlaySound("dirtyHit", 450);
                BellsAndWhistles.PlaySound("dirtyHit", 900);
                BellsAndWhistles.PlaySound("dirtyHit", 1350);
            }

            if (Game.IsCurrentLocation(moddedLocation.GetOriginal()))
            {
                moddedAnimal.AnimateFindingProduce();
            }
            else
            {
                moddedAnimal.FindProduce(moddedPlayer.GetOriginal());
            }
        }