public static int GetRandomFish(IEnumerable <KeyValuePair <int, FishData> > possibleFish) { ConfigMain config = ModFishing.INSTANCE.Config; possibleFish = possibleFish.ToList(); if (!config.ConfigLegendaries) { possibleFish = possibleFish.Where(e => !FishHelper.IsLegendary(e.Key)); } return(!possibleFish.Any() ? FishHelper.GetRandomTrash() : possibleFish.Select(e => new KeyValuePair <int, double>(e.Key, e.Value.Chance)).Choose(Game1.random)); }
public static void StartMinigameEndFunction(FishingRod rod, int extra) { ModFishing.INSTANCE.Monitor.Log("Overriding fishing minigame", LogLevel.Trace); ConfigMain config = ModFishing.INSTANCE.Config; SFarmer lastUser = ModFishing.INSTANCE.Helper.Reflection.GetPrivateValue <SFarmer>(rod, "lastUser"); Vector2 bobber = ModFishing.INSTANCE.Helper.Reflection.GetPrivateValue <Vector2>(rod, "bobber"); rod.isReeling = true; rod.hit = false; switch (lastUser.FacingDirection) { case 1: lastUser.FarmerSprite.setCurrentSingleFrame(48, 32000, false, false); break; case 3: lastUser.FarmerSprite.setCurrentSingleFrame(48, 32000, false, true); break; } lastUser.FarmerSprite.pauseForSingleAnimation = true; int clearWaterDistance = FishingRod.distanceToLand((int)(bobber.X / (double)Game1.tileSize - 1.0), (int)(bobber.Y / (double)Game1.tileSize - 1.0), lastUser.currentLocation); FishingRodOverrides.ClearWaterDistances[lastUser] = clearWaterDistance; float num = 1f * (clearWaterDistance / 5f) * (Game1.random.Next(1 + Math.Min(10, lastUser.FishingLevel) / 2, 6) / 5f); if (rod.favBait) { num *= 1.2f; } float fishSize = Math.Max(0.0f, Math.Min(1f, num * (float)(1.0 + Game1.random.Next(-10, 10) / 100.0))); bool treasure = false; double treasureChance = config.TreasureChance + lastUser.LuckLevel * config.TreasureLuckLevelEffect + (rod.getBaitAttachmentIndex() == 703 ? config.TreasureBaitEffect : 0.0) + (rod.getBobberAttachmentIndex() == 693 ? config.TreasureBobberEffect : 0.0) + Game1.dailyLuck * config.TreasureDailyLuckEffect + (lastUser.professions.Contains(9) ? config.TreasureChance : 0.0) + config.TreasureStreakEffect * FishHelper.GetStreak(lastUser); treasureChance = Math.Min(treasureChance, config.MaxTreasureChance); if (!Game1.isFestival() && lastUser.fishCaught != null && lastUser.fishCaught.Count > 1 && Game1.random.NextDouble() < treasureChance) { treasure = true; } // Override caught fish bool legendary = FishHelper.IsLegendary(extra); if (!config.UseVanillaFish && (!config.VanillaLegendaries || !legendary)) { int origExtra = extra; extra = FishHelper.GetRandomFish(clearWaterDistance); if (FishHelper.IsTrash(extra)) { if (false) // TODO: Replace this with code relating to a config option that determines the chance you'll get fish/trash { #pragma warning disable CS0162 // Unreachable code detected Game1.showGlobalMessage("No valid fish to catch! Giving junk instead."); StardewValley.Object o = new StardewValley.Object(extra, 1, false, -1, 0); rod.pullFishFromWater(extra, -1, 0, 0, false, false); return; #pragma warning restore CS0162 // Unreachable code detected } else { ModFishing.INSTANCE.Monitor.Log("No valid fish to catch! Using original fish instead.", LogLevel.Warn); extra = origExtra; } } } // Show custom bobber bar Game1.activeClickableMenu = new CustomBobberBar(lastUser, extra, fishSize, treasure, rod.attachments[1] != null ? rod.attachments[1].ParentSheetIndex : -1, clearWaterDistance); }