internal JoeMenu(int width, int height, ModEntry mod) : base(Game1.viewport.Width / 2 - width / 2, Game1.viewport.Height / 2 - height / 2, width, height, true) { _mod = mod; ITranslationHelper translation = mod.Helper.Translation; _upCursor = new ClickableTextureComponent("up-arrow", new Rectangle(xPositionOnScreen + this.width + Game1.tileSize / 4, yPositionOnScreen + Game1.tileSize, 11 * Game1.pixelZoom, 12 * Game1.pixelZoom), "", "", Game1.mouseCursors, new Rectangle(421, 459, 11, 12), Game1.pixelZoom); _downCursor = new ClickableTextureComponent("down-arrow", new Rectangle(xPositionOnScreen + this.width + Game1.tileSize / 4, yPositionOnScreen + this.height - Game1.tileSize, 11 * Game1.pixelZoom, 12 * Game1.pixelZoom), "", "", Game1.mouseCursors, new Rectangle(421, 472, 11, 12), Game1.pixelZoom); _scrollBar = new ClickableTextureComponent(new Rectangle(_upCursor.bounds.X + 12, _upCursor.bounds.Y + _upCursor.bounds.Height + 4, 24, 40), Game1.mouseCursors, new Rectangle(435, 463, 6, 10), 4f); _scrollBarRunner = new Rectangle(_scrollBar.bounds.X, _upCursor.bounds.Y + _upCursor.bounds.Height + 4, _scrollBar.bounds.Width, height - 128 - _upCursor.bounds.Height - 8); _tabAutomationString = translation.Get("tab.automation"); Vector2 size = _font.MeasureString(_tabAutomationString); _tabAutomation = new Rectangle(xPositionOnScreen - (int)size.X - 20, yPositionOnScreen, (int)size.X + 32, 64); _tabUIsString = translation.Get("tab.UIs"); size = _font.MeasureString(_tabUIsString); _tabUIs = new Rectangle(xPositionOnScreen - (int)size.X - 20, yPositionOnScreen + 68, (int)size.X + 32, 64); _tabMiscString = translation.Get("tab.misc"); size = _font.MeasureString(_tabMiscString); _tabMisc = new Rectangle(xPositionOnScreen - (int)size.X - 20, yPositionOnScreen + 68 * 2, (int)size.X + 32, 64); _tabControlsString = translation.Get("tab.controls"); size = _font.MeasureString(_tabControlsString); _tabControls = new Rectangle(xPositionOnScreen - (int)size.X - 20, yPositionOnScreen + 68 * 3, (int)size.X + 32, 64); { //Automation Tab MenuTab tab = new MenuTab(); tab.AddOptionsElement(new EmptyLabel()); tab.AddOptionsElement(new LabelComponent("Balanced Mode")); tab.AddOptionsElement(new ModifiedCheckBox("BalancedMode", 20, ModEntry.Conf.BalancedMode, OnCheckboxValueChanged)); tab.AddOptionsElement(new EmptyLabel()); tab.AddOptionsElement(new LabelComponent("Auto Water Nearby Crops")); tab.AddOptionsElement(new ModifiedCheckBox("AutoWaterNearbyCrops", 2, ModEntry.Conf.AutoWaterNearbyCrops, OnCheckboxValueChanged)); tab.AddOptionsElement(new ModifiedSlider("AutoWaterRadius", 3, ModEntry.Conf.AutoWaterRadius, 1, 3, OnSliderValueChanged, () => !ModEntry.Conf.AutoWaterNearbyCrops || ModEntry.Conf.BalancedMode)); tab.AddOptionsElement(new ModifiedCheckBox("FindCanFromInventory", 16, ModEntry.Conf.FindCanFromInventory, OnCheckboxValueChanged, i => !(ModEntry.Conf.AutoWaterNearbyCrops || ModEntry.Conf.AutoRefillWateringCan))); tab.AddOptionsElement(new EmptyLabel()); tab.AddOptionsElement(new LabelComponent("Auto Pet Nearby Animals/Pets")); tab.AddOptionsElement(new ModifiedCheckBox("AutoPetNearbyAnimals", 3, ModEntry.Conf.AutoPetNearbyAnimals, OnCheckboxValueChanged)); tab.AddOptionsElement(new ModifiedCheckBox("AutoPetNearbyPets", 24, ModEntry.Conf.AutoPetNearbyPets, OnCheckboxValueChanged)); tab.AddOptionsElement(new ModifiedSlider("AutoPetRadius", 4, ModEntry.Conf.AutoPetRadius, 1, 3, OnSliderValueChanged, () => !ModEntry.Conf.AutoPetNearbyAnimals || ModEntry.Conf.BalancedMode)); tab.AddOptionsElement(new EmptyLabel()); tab.AddOptionsElement(new LabelComponent("Auto Animal Door")); tab.AddOptionsElement(new ModifiedCheckBox("AutoAnimalDoor", 4, ModEntry.Conf.AutoAnimalDoor, OnCheckboxValueChanged)); tab.AddOptionsElement(new EmptyLabel()); tab.AddOptionsElement(new LabelComponent("Auto Fishing")); tab.AddOptionsElement(new ModifiedCheckBox("AutoFishing", 5, ModEntry.Conf.AutoFishing, OnCheckboxValueChanged)); tab.AddOptionsElement(new ModifiedSlider("CPUThresholdFishing", 0, (int)(ModEntry.Conf.CpuThresholdFishing * 10), 0, 5, OnSliderValueChanged, () => !ModEntry.Conf.AutoFishing, Format)); tab.AddOptionsElement(new EmptyLabel()); tab.AddOptionsElement(new LabelComponent("Fishing Tweaks")); tab.AddOptionsElement(new ModifiedCheckBox("AutoReelRod", 6, ModEntry.Conf.AutoReelRod, OnCheckboxValueChanged)); tab.AddOptionsElement(new EmptyLabel()); tab.AddOptionsElement(new LabelComponent("Auto Gate")); tab.AddOptionsElement(new ModifiedCheckBox("AutoGate", 9, ModEntry.Conf.AutoGate, OnCheckboxValueChanged)); tab.AddOptionsElement(new EmptyLabel()); tab.AddOptionsElement(new LabelComponent("Auto Eat")); tab.AddOptionsElement(new ModifiedCheckBox("AutoEat", 10, ModEntry.Conf.AutoEat, OnCheckboxValueChanged)); tab.AddOptionsElement(new ModifiedSlider("StaminaToEatRatio", 1, (int)(ModEntry.Conf.StaminaToEatRatio * 10), 1, 8, OnSliderValueChanged, () => !ModEntry.Conf.AutoEat, Format)); tab.AddOptionsElement(new ModifiedSlider("HealthToEatRatio", 2, (int)(ModEntry.Conf.HealthToEatRatio * 10), 1, 8, OnSliderValueChanged, () => !ModEntry.Conf.AutoEat, Format)); tab.AddOptionsElement(new EmptyLabel()); tab.AddOptionsElement(new LabelComponent("Auto Harvest")); tab.AddOptionsElement(new ModifiedCheckBox("AutoHarvest", 11, ModEntry.Conf.AutoHarvest, OnCheckboxValueChanged)); tab.AddOptionsElement(new ModifiedSlider("AutoHarvestRadius", 5, ModEntry.Conf.AutoHarvestRadius, 1, 3, OnSliderValueChanged, () => !ModEntry.Conf.AutoHarvest || ModEntry.Conf.BalancedMode)); tab.AddOptionsElement(new ModifiedCheckBox("ProtectNectarProducingFlower", 25, ModEntry.Conf.ProtectNectarProducingFlower, OnCheckboxValueChanged, i => !ModEntry.Conf.AutoHarvest)); tab.AddOptionsElement(new EmptyLabel()); tab.AddOptionsElement(new LabelComponent("Auto Destroy Dead Crops")); tab.AddOptionsElement(new ModifiedCheckBox("AutoDestroyDeadCrops", 12, ModEntry.Conf.AutoDestroyDeadCrops, OnCheckboxValueChanged)); tab.AddOptionsElement(new EmptyLabel()); tab.AddOptionsElement(new LabelComponent("Auto Refill Watering Can")); tab.AddOptionsElement(new ModifiedCheckBox("AutoRefillWateringCan", 13, ModEntry.Conf.AutoRefillWateringCan, OnCheckboxValueChanged)); tab.AddOptionsElement(new EmptyLabel()); tab.AddOptionsElement(new LabelComponent("Auto Collect Collectibles")); tab.AddOptionsElement(new ModifiedCheckBox("AutoCollectCollectibles", 14, ModEntry.Conf.AutoCollectCollectibles, OnCheckboxValueChanged)); tab.AddOptionsElement(new ModifiedSlider("AutoCollectRadius", 6, ModEntry.Conf.AutoCollectRadius, 1, 3, OnSliderValueChanged, () => !ModEntry.Conf.AutoCollectCollectibles || ModEntry.Conf.BalancedMode)); tab.AddOptionsElement(new EmptyLabel()); tab.AddOptionsElement(new LabelComponent("Auto Shake Fruited Plants")); tab.AddOptionsElement(new ModifiedCheckBox("AutoShakeFruitedPlants", 15, ModEntry.Conf.AutoShakeFruitedPlants, OnCheckboxValueChanged)); tab.AddOptionsElement(new ModifiedSlider("AutoShakeRadius", 7, ModEntry.Conf.AutoShakeRadius, 1, 3, OnSliderValueChanged, () => !ModEntry.Conf.AutoShakeFruitedPlants || ModEntry.Conf.BalancedMode)); tab.AddOptionsElement(new EmptyLabel()); tab.AddOptionsElement(new LabelComponent("Auto Dig Artifact Spot")); tab.AddOptionsElement(new ModifiedCheckBox("AutoDigArtifactSpot", 17, ModEntry.Conf.AutoDigArtifactSpot, OnCheckboxValueChanged)); tab.AddOptionsElement(new ModifiedSlider("AutoDigRadius", 8, ModEntry.Conf.AutoDigRadius, 1, 3, OnSliderValueChanged, () => !ModEntry.Conf.AutoDigArtifactSpot || ModEntry.Conf.BalancedMode)); tab.AddOptionsElement(new ModifiedCheckBox("FindHoeFromInventory", 18, ModEntry.Conf.FindHoeFromInventory, OnCheckboxValueChanged, i => !ModEntry.Conf.AutoDigArtifactSpot)); tab.AddOptionsElement(new EmptyLabel()); tab.AddOptionsElement(new LabelComponent("Auto Deposit/Pull Machines")); tab.AddOptionsElement(new ModifiedCheckBox("AutoDepositIngredient", 22, ModEntry.Conf.AutoDepositIngredient, OnCheckboxValueChanged)); tab.AddOptionsElement(new ModifiedCheckBox("AutoPullMachineResult", 23, ModEntry.Conf.AutoPullMachineResult, OnCheckboxValueChanged)); tab.AddOptionsElement(new ModifiedSlider("MachineRadius", 10, ModEntry.Conf.MachineRadius, 1, 3, OnSliderValueChanged, () => !(ModEntry.Conf.AutoPullMachineResult || ModEntry.Conf.AutoDepositIngredient) || ModEntry.Conf.BalancedMode)); tab.AddOptionsElement(new EmptyLabel()); tab.AddOptionsElement(new LabelComponent("Auto Loot Treasures")); tab.AddOptionsElement(new ModifiedCheckBox("AutoLootTreasures", 30, ModEntry.Conf.AutoLootTreasures, OnCheckboxValueChanged)); tab.AddOptionsElement(new ModifiedCheckBox("CloseTreasureWhenAllLooted", 31, ModEntry.Conf.CloseTreasureWhenAllLooted, OnCheckboxValueChanged)); tab.AddOptionsElement(new EmptyLabel()); tab.AddOptionsElement(new LabelComponent("Auto Pick Up Trash")); tab.AddOptionsElement(new ModifiedCheckBox("AutoPickUpTrash", 34, ModEntry.Conf.AutoPickUpTrash, OnCheckboxValueChanged)); tab.AddOptionsElement(new ModifiedSlider("ScavengingRadius", 13, ModEntry.Conf.ScavengingRadius, 1, 3, OnSliderValueChanged, () => !ModEntry.Conf.AutoPickUpTrash || ModEntry.Conf.BalancedMode)); tab.AddOptionsElement(new EmptyLabel()); tab.AddOptionsElement(new LabelComponent("Auto Shearing and Milking")); tab.AddOptionsElement(new ModifiedCheckBox("AutoShearingAndMilking", 35, ModEntry.Conf.AutoShearingAndMilking, OnCheckboxValueChanged)); tab.AddOptionsElement(new ModifiedSlider("AnimalHarvestRadius", 14, ModEntry.Conf.AnimalHarvestRadius, 1, 3, OnSliderValueChanged, () => !ModEntry.Conf.AutoShearingAndMilking || ModEntry.Conf.BalancedMode)); tab.AddOptionsElement(new EmptyLabel()); tab.AddOptionsElement(new LabelComponent("Collect Letter Attachments And Quests")); tab.AddOptionsElement(new ModifiedCheckBox("CollectLetterAttachmentsAndQuests", 36, ModEntry.Conf.CollectLetterAttachmentsAndQuests, OnCheckboxValueChanged)); tab.AddOptionsElement(new EmptyLabel()); _tabs.Add(tab); } { //UIs Tab MenuTab tab = new MenuTab(); tab.AddOptionsElement(new EmptyLabel()); tab.AddOptionsElement(new LabelComponent("Config Menu")); tab.AddOptionsElement(new ModifiedCheckBox("FilterBackgroundInMenu", 32, ModEntry.Conf.FilterBackgroundInMenu, OnCheckboxValueChanged)); tab.AddOptionsElement(new EmptyLabel()); tab.AddOptionsElement(new LabelComponent("Mine Info GUI")); tab.AddOptionsElement(new ModifiedCheckBox("MineInfoGUI", 0, ModEntry.Conf.MineInfoGui, OnCheckboxValueChanged)); tab.AddOptionsElement(new EmptyLabel()); tab.AddOptionsElement(new LabelComponent("Gift Information Tooltip")); tab.AddOptionsElement(new ModifiedCheckBox("GiftInformation", 1, ModEntry.Conf.GiftInformation, OnCheckboxValueChanged)); tab.AddOptionsElement(new EmptyLabel()); tab.AddOptionsElement(new LabelComponent("Fishing Info")); tab.AddOptionsElement(new ModifiedCheckBox("FishingInfo", 8, ModEntry.Conf.FishingInfo, OnCheckboxValueChanged)); tab.AddOptionsElement(new EmptyLabel()); tab.AddOptionsElement(new LabelComponent("Fishing Probabilities Information")); tab.AddOptionsElement(new ModifiedCheckBox("FishingProbabilitiesInfo", 26, ModEntry.Conf.FishingProbabilitiesInfo, OnCheckboxValueChanged)); tab.AddOptionsElement(new EmptyLabel()); tab.AddOptionsElement(new LabelComponent("Show Shipping Price")); tab.AddOptionsElement(new ModifiedCheckBox("EstimateShippingPrice", 28, ModEntry.Conf.EstimateShippingPrice, OnCheckboxValueChanged)); tab.AddOptionsElement(new EmptyLabel()); _tabs.Add(tab); } { //Misc Tab MenuTab tab = new MenuTab(); tab.AddOptionsElement(new EmptyLabel()); tab.AddOptionsElement(new LabelComponent("Crafting From Chests")); tab.AddOptionsElement(new ModifiedCheckBox("CraftingFromChests", 27, ModEntry.Conf.CraftingFromChests, OnCheckboxValueChanged, i => ModEntry.IsCCOn)); tab.AddOptionsElement(new ModifiedSlider("RadiusCraftingFromChests", 11, ModEntry.Conf.RadiusCraftingFromChests, 1, 5, OnSliderValueChanged, () => !ModEntry.Conf.CraftingFromChests || ModEntry.Conf.BalancedMode)); tab.AddOptionsElement(new EmptyLabel()); tab.AddOptionsElement(new LabelComponent("Unify Flower Colors")); tab.AddOptionsElement(new ModifiedCheckBox("UnifyFlowerColors", 29, ModEntry.Conf.UnifyFlowerColors, OnCheckboxValueChanged)); tab.AddOptionsElement(new EmptyLabel()); tab.AddOptionsElement(new LabelComponent("Pause When Idle")); tab.AddOptionsElement(new ModifiedCheckBox("PauseWhenIdle", 33, ModEntry.Conf.PauseWhenIdle, OnCheckboxValueChanged)); tab.AddOptionsElement(new ModifiedSlider("IdleTimeout", 12, ModEntry.Conf.IdleTimeout, 1, 300, OnSliderValueChanged, () => !ModEntry.Conf.PauseWhenIdle, (which, value) => value + "s")); tab.AddOptionsElement(new EmptyLabel()); _tabs.Add(tab); } { //Controls Tab MenuTab tab = new MenuTab(); tab.AddOptionsElement(new EmptyLabel()); tab.AddOptionsElement(new LabelComponent("Config Menu")); tab.AddOptionsElement(new ModifiedInputListener(this, "KeyShowMenu", 0, ModEntry.Conf.ButtonShowMenu, translation, OnInputListnerChanged, OnStartListening)); tab.AddOptionsElement(new EmptyLabel()); tab.AddOptionsElement(new LabelComponent("Auto Harvest")); tab.AddOptionsElement(new ModifiedInputListener(this, "KeyToggleBlackList", 1, ModEntry.Conf.ButtonToggleBlackList, translation, OnInputListnerChanged, OnStartListening)); tab.AddOptionsElement(new EmptyLabel()); _tabs.Add(tab); } }