/// <summary> ///A little debug and development helper /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void OnButtonPressed(object sender, ButtonPressedEventArgs e) { if (!Context.IsWorldReady) { return; } if (e.Button == SButton.End) { if (Context.IsPlayerFree && Game1.activeClickableMenu == null) { var carpenterMenu = new CarpenterMenu(); Game1.activeClickableMenu = (IClickableMenu)carpenterMenu; } else if (Game1.activeClickableMenu is CarpenterMenu) { Game1.displayFarmer = true; ((CarpenterMenu)Game1.activeClickableMenu).exitThisMenu(); } } else if (e.Button == SButton.Home) { Game1.warpFarmer("Farm", Game1.player.getTileX(), Game1.player.getTileY(), Game1.player.facingDirection); } }
/// <summary> /// Brings up the menu to move the building /// </summary> private void RearrangeFarm() { //our boolean to keep track that we are currently in a Farm rearranger menu //so we don't mess with any other vanilla warps to robin's house isArranging = true; //remember the location, which should be Farm, but could be anywhere depending on configs loc = Game1.currentLocation; //for some reason the player gets watrped one tile to the left when using this menu on the farm //so i move them a tile to the right to prevent them getting warped into a solid tile if (loc.Name == "Farm") { var pos = Game1.player.Position; Game1.player.Position = new Vector2(pos.X + 64, pos.Y); } //open the carpenter menu then do everything that is normally done //when the move buildings option is clicked var menu = new CarpenterMenu(); Game1.activeClickableMenu = menu; Game1.globalFadeToBlack(new Game1.afterFadeFunction(menu.setUpForBuildingPlacement), 0.02f); Game1.playSound("smallSelect"); Helper.Reflection.GetField <bool>(menu, "onFarm").SetValue(true); Helper.Reflection.GetField <bool>(menu, "moving").SetValue(true); }
/// <summary>The event called when the player presses a keyboard button.</summary> /// <param name="sender">The event sender.</param> /// <param name="e">The event arguments.</param> private void InputEvents_ButtonPressed(object sender, EventArgsInput e) { if (e.Button == _config.ToggleInstantBuildMenuButton && Game1.currentLocation is Farm) { if (Context.IsPlayerFree && Game1.activeClickableMenu == null) { if (_tractorModFound) { //Get tractor blueprint from carpenter menu var carpenterMenu = new CarpenterMenu(); Game1.activeClickableMenu = (IClickableMenu)carpenterMenu; Game1.delayedActions.Add(new DelayedAction(100, new DelayedAction.delayedBehavior(this.getTractorBlueprintFromCarpenterMenu))); } else { activateInstantBuildMenu(); } } else if (Game1.activeClickableMenu is InstantBuildMenu) { Game1.displayFarmer = true; ((InstantBuildMenu)Game1.activeClickableMenu).exitThisMenu(); } } }
/// <summary>The event called after an active menu is opened or closed.</summary> /// <param name="sender">The event sender.</param> /// <param name="e">The event arguments.</param> private void OnMenuChanged(object sender, MenuChangedEventArgs e) { if (!Context.IsWorldReady) { return; } // add blueprints if (e.NewMenu is CarpenterMenu) { CarpenterMenu carpenterMenu = e.NewMenu as CarpenterMenu; bool magicalConstruction = this.Helper.Reflection .GetField <bool>(e.NewMenu, "magicalConstruction") .GetValue(); // get field IList <BluePrint> blueprints = this.Helper.Reflection .GetField <List <BluePrint> >(e.NewMenu, "blueprints") .GetValue(); List <BuildingPatch> buildingPatches = this.BuildingPatches.Values // to get just the List<BuildingPatch>s .SelectMany(x => x.Where(patch => (magicalConstruction && patch.IsMagical()) || (!magicalConstruction && !patch.IsMagical()))) // flatten and remove magical if necessary .ToList(); // convert to list foreach (BuildingPatch patch in buildingPatches) { blueprints.Add(new BluePrint(patch.Type)); // add unloaded blueprints } } }
private static void SetupButtons(CarpenterMenu carpenterMenu) { Monitor.Log("CarpenterMenu: Setting up buttons.", LogLevel.Trace); moneyButtonEnabled = false; hoverTextOn = Helper.Translation.Get("menu.carpentermoneybuttonon"); hoverTextOff = Helper.Translation.Get("menu.carpentermoneybuttonoff"); ingredInfoWood = Helper.Translation.Get("menu.carpenteringredinfo", new { itemname = woodObject.DisplayName }); ingredInfoStone = Helper.Translation.Get("menu.carpenteringredinfo", new { itemname = stoneObject.DisplayName }); int xPositionOnScreen = xPositionOnScreen = Game1.uiViewport.Width / 2 - carpenterMenu.maxWidthOfBuildingViewer - IClickableMenu.spaceToClearSideBorder; int yPositionOnScreen = Game1.uiViewport.Height / 2 - carpenterMenu.maxHeightOfBuildingViewer / 2 - IClickableMenu.spaceToClearTopBorder + 32; int width = carpenterMenu.maxWidthOfBuildingViewer + carpenterMenu.maxWidthOfDescription + IClickableMenu.spaceToClearSideBorder * 2 + 64; int height = carpenterMenu.maxHeightOfBuildingViewer + IClickableMenu.spaceToClearTopBorder; int x = xPositionOnScreen + width - IClickableMenu.borderWidth - IClickableMenu.spaceToClearSideBorder - 320 - 20 - 64 - 20; int y = yPositionOnScreen + carpenterMenu.maxHeightOfBuildingViewer + 64; //int x = carpenterMenu.xPositionOnScreen + carpenterMenu.width - IClickableMenu.borderWidth - IClickableMenu.spaceToClearSideBorder - 320 - 20 - 64 - 10; //int y = carpenterMenu.yPositionOnScreen + carpenterMenu.maxHeightOfBuildingViewer + 64; cancelTexture = new ClickableTextureComponent("CMON", new Rectangle(x + 5, y + 5, 64 - 8, 64 - 8), null, hoverTextOn, Game1.mouseCursors, new Microsoft.Xna.Framework.Rectangle(267, 469, 16, 16), 3.0f, false); moneyButton = new ClickableTextureComponent("MON", new Rectangle(x, y, 64, 64), null, hoverTextOn, Game1.mouseCursors, new Microsoft.Xna.Framework.Rectangle(0, 384, 16, 16), 4f, false) { myID = moneyButtonID, leftNeighborID = CarpenterMenu.region_forwardButton, rightNeighborID = CarpenterMenu.region_moveBuitton, visible = true }; carpenterMenu.forwardButton.rightNeighborID = moneyButtonID; carpenterMenu.moveButton.leftNeighborID = moneyButtonID; }
// BUG: player warps back to wizard hut after use private void OpenJunimoHutMenu() { CarpenterMenu menu = new CarpenterMenu(true); var blueprints = Helper.Reflection.GetField <List <BluePrint> >(menu, "blueprints"); List <BluePrint> newBluePrints = new List <BluePrint>(); newBluePrints.Add(new BluePrint("Junimo Hut")); blueprints.SetValue(newBluePrints); Game1.activeClickableMenu = (IClickableMenu)menu; }
public override void drawInMenu(SpriteBatch b, int x, int y) { CarpenterMenu menu = Game1.activeClickableMenu as CarpenterMenu; float texScale = 2; int num1 = (menu.maxWidthOfBuildingViewer - (int)(texture.Width * texScale)) / 2; num1 -= (int)(texture.Width / 3.5); int num2 = (menu.maxHeightOfBuildingViewer - (int)(texture.Height * texScale)) / 2; this.drawShadow(b, num1, num2); b.Draw(this.texture, new Rectangle(Game1.activeClickableMenu.xPositionOnScreen + num1, Game1.activeClickableMenu.yPositionOnScreen + num2, (int)(texture.Width * texScale), (int)(texture.Height * texScale)), Color.White); }
private void menuChanged(object sender, MenuChangedEventArgs e) { CarpenterMenu menu1 = e.NewMenu as CarpenterMenu; PurchaseAnimalsMenu menu2 = e.NewMenu as PurchaseAnimalsMenu; if (menu1 != null || menu2 != null) { if (menu1 != null) { var blueprints = Helper.Reflection.GetField <List <BluePrint> >(menu1, "blueprints").GetValue(); var locs = GetAllLocations(); foreach (var loc in locs) { if (loc is BuildableGameLocation bloc) { if (bloc.isBuildingConstructed("Coop") && blueprints.FirstOrDefault(bp => bp.name == "Big Coop") == null) { blueprints.Add(new BluePrint("Big Coop")); } if (bloc.isBuildingConstructed("Big Coop") && blueprints.FirstOrDefault(bp => bp.name == "Deluxe Coop") == null) { blueprints.Add(new BluePrint("Deluxe Coop")); } if (bloc.isBuildingConstructed("Barn") && blueprints.FirstOrDefault(bp => bp.name == "Big Barn") == null) { blueprints.Add(new BluePrint("Big Barn")); } if (bloc.isBuildingConstructed("Big Barn") && blueprints.FirstOrDefault(bp => bp.name == "Deluxe Barn") == null) { blueprints.Add(new BluePrint("Deluxe Barn")); } if (bloc.isBuildingConstructed("Shed") && blueprints.FirstOrDefault(bp => bp.name == "Big Shed") == null) { blueprints.Add(new BluePrint("Big Shed")); } } } } Helper.Events.GameLoop.UpdateTicked += doMenuUpdate; Helper.Events.Display.RenderedActiveMenu += doMenuRender; Helper.Events.Input.ButtonPressed += doMenuButtons; } if (e.OldMenu is CarpenterMenu || e.OldMenu is PurchaseAnimalsMenu) { Helper.Events.GameLoop.UpdateTicked -= doMenuUpdate; Helper.Events.Display.RenderedActiveMenu -= doMenuRender; Helper.Events.Input.ButtonPressed -= doMenuButtons; } }
private static void Display_RenderingActiveMenu(object sender, RenderingActiveMenuEventArgs e) { CarpenterMenu carpenterMenu = (CarpenterMenu)Game1.activeClickableMenu; bool onFarm = Helper.Reflection.GetField <bool>(carpenterMenu, "onFarm").GetValue(); if (onFarm) { return; } int X = Game1.getMouseX(); int Y = Game1.getMouseY(); moneyButton.tryHover(X, Y); if (moneyButton.containsPoint(X, Y)) { Helper.Reflection.GetField <string>(carpenterMenu, "hoverText").SetValue(moneyButtonEnabled ? hoverTextOff : hoverTextOn); } }
/// <summary> /// Brings up the menu to move the building /// </summary> private void RearrangeFarm() { //our boolean to keep track that we are currently in a Farm rearranger menu //so we don't mess with any other vanilla warps to robin's house isArranging = true; //remember the location, which should be Farm, but could be anywhere depending on configs loc = Game1.currentLocation; //open the carpenter menu then do everything that is normally done //when the move buildings option is clicked var menu = new CarpenterMenu(); Game1.activeClickableMenu = menu; Game1.globalFadeToBlack(new Game1.afterFadeFunction(menu.setUpForBuildingPlacement), 0.02f); Game1.playSound("smallSelect"); Helper.Reflection.GetField <bool>(menu, "onFarm").SetValue(true); Helper.Reflection.GetField <bool>(menu, "moving").SetValue(true); }
private static void SetupButtons(CarpenterMenu carpenterMenu) { Monitor.Log("CarpenterMenu: Setting up buttons.", LogLevel.Trace); moneyButtonEnabled = false; hoverTextOn = Helper.Translation.Get("menu.carpentermoneybuttonon"); hoverTextOff = Helper.Translation.Get("menu.carpentermoneybuttonoff"); ingredInfo = Helper.Translation.Get("menu.carpenteringredinfo"); cancelTexture = new ClickableTextureComponent("CMON", new Rectangle(carpenterMenu.xPositionOnScreen + carpenterMenu.width - IClickableMenu.borderWidth - IClickableMenu.spaceToClearSideBorder - 256 - 20 - 64 - 10 + 5, carpenterMenu.yPositionOnScreen + carpenterMenu.maxHeightOfBuildingViewer + 64 + 5, 64 - 8, 64 - 8), null, hoverTextOn, Game1.mouseCursors, new Microsoft.Xna.Framework.Rectangle(267, 469, 16, 16), 3.0f, false); moneyButton = new ClickableTextureComponent("MON", new Rectangle(carpenterMenu.xPositionOnScreen + carpenterMenu.width - IClickableMenu.borderWidth - IClickableMenu.spaceToClearSideBorder - 256 - 20 - 64 - 10, carpenterMenu.yPositionOnScreen + carpenterMenu.maxHeightOfBuildingViewer + 64, 64, 64), null, hoverTextOn, Game1.mouseCursors, new Microsoft.Xna.Framework.Rectangle(0, 384, 16, 16), 4f, false) { myID = moneyButtonID, leftNeighborID = CarpenterMenu.region_forwardButton, rightNeighborID = CarpenterMenu.region_moveBuitton, visible = true }; carpenterMenu.forwardButton.rightNeighborID = moneyButtonID; carpenterMenu.moveButton.leftNeighborID = moneyButtonID; }
private static void SetupBlueprints(CarpenterMenu carpenterMenu) { Monitor.Log("CarpenterMenu: Setting up blueprints.", LogLevel.Trace); setupBlueprints = true; vanillaBlueprints = new List <BluePrint>(Helper.Reflection.GetField <List <BluePrint> >(carpenterMenu, "blueprints").GetValue()); modBlueprints = new List <BluePrint>(vanillaBlueprints); saleBlueprints = new List <BluePrint>(vanillaBlueprints); for (int i = 0; i < modBlueprints.Count; i++) { modBlueprints[i] = NewBlueprint(vanillaBlueprints[i]); saleBlueprints[i] = NewBlueprint(vanillaBlueprints[i]); modBlueprints[i].itemsRequired.Remove(woodObject.ParentSheetIndex); //modBlueprints[i].itemsRequired.Add(woodObject.ParentSheetIndex, 0); modBlueprints[i].itemsRequired.Remove(stoneObject.ParentSheetIndex); //modBlueprints[i].itemsRequired.Add(stoneObject.ParentSheetIndex, 0); modBlueprints[i].moneyRequired = GetPrice(vanillaBlueprints[i]); saleBlueprints[i].moneyRequired = GetPrice(vanillaBlueprints[i]); } }
private void HandleInstantBuildButtonClick() { if (Context.IsPlayerFree && Game1.activeClickableMenu == null) { if (_tractorModFound) { //Get tractor blueprint from carpenter menu var carpenterMenu = new CarpenterMenu(); Game1.activeClickableMenu = (IClickableMenu)carpenterMenu; Game1.delayedActions.Add(new DelayedAction(100, new DelayedAction.delayedBehavior(this.getTractorBlueprintFromCarpenterMenu))); } else { activateInstantBuildMenu(); } } else if (Game1.activeClickableMenu is InstantBuildMenu) { Game1.displayFarmer = true; ((InstantBuildMenu)Game1.activeClickableMenu).exitThisMenu(); } }
private static bool HasBluePrint(CarpenterMenu carpenterMenu) { return(GetBluePrints(carpenterMenu).Exists(bluePrint => bluePrint.name == WOODS_OBELISK_BUILDING_NAME)); }
private static bool IsMagical(CarpenterMenu carpenterMenu) { return((bool)carpenterMenu.GetType().GetField("magicalConstruction", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public).GetValue(carpenterMenu) || GetBluePrints(carpenterMenu).Exists(bluePrint => bluePrint.magical)); }
private static List <BluePrint> GetBluePrints(CarpenterMenu carpenterMenu) { return((List <BluePrint>)carpenterMenu.GetType().GetField("blueprints", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public).GetValue(carpenterMenu)); }
internal static void CarpenterMenuPatch( CarpenterMenu __instance, bool ___onFarm, List <Item> ___ingredients, int ___price, List <BluePrint> ___blueprints, int ___currentBlueprintIndex, bool ___upgrading, bool ___demolishing, bool ___moving, bool ___painting, bool ___magicalConstruction) { try { isOnFarm = ___onFarm; carpenterMenu = __instance; isMagicalConstruction = ___magicalConstruction; if (!___onFarm) { isUpgrading = false; isDemolishing = false; isPainting = false; isMoving = false; isConstructing = false; #region The blueprint menu BluePrint currentBluprint = __instance.CurrentBlueprint; if (currentBluprint == null) { return; } int x = Game1.getMouseX(true), y = Game1.getMouseY(true); // Mouse x and y position bool isCPressed = MainClass.Config.PrimaryInfoKey.JustPressed(); string ingredients = ""; string name = currentBluprint.displayName; string upgradeName = currentBluprint.nameOfBuildingToUpgrade; string description = currentBluprint.description; string price = $"{___price}g"; string blueprintInfo; int width = currentBluprint.tilesWidth; int height = currentBluprint.tilesHeight; #region Get ingredients for (int i = 0; i < ___ingredients.Count; i++) { string itemName = ___ingredients[i].DisplayName; int itemStack = ___ingredients[i].Stack; string itemQuality = ""; int qualityValue = ((StardewValley.Object)___ingredients[i]).Quality; if (qualityValue == 1) { itemQuality = "Silver quality"; } else if (qualityValue == 2 || qualityValue == 3) { itemQuality = "Gold quality"; } else if (qualityValue >= 4) { itemQuality = "Iridium quality"; } ingredients = $"{ingredients}, {itemStack} {itemName} {itemQuality}"; } #endregion blueprintInfo = $"{name}, Price: {price}, Ingredients: {ingredients}, Dimensions: {width} width and {height} height, Description: {description}"; if (isCPressed && !isSayingBlueprintInfo) { SayBlueprintInfo(blueprintInfo); } else if (prevBlueprintInfo != blueprintInfo) { prevBlueprintInfo = blueprintInfo; SayBlueprintInfo(blueprintInfo); } else { if (__instance.backButton != null && __instance.backButton.containsPoint(x, y)) { string toSpeak = "Previous Blueprint"; if (carpenterMenuQuery != toSpeak) { carpenterMenuQuery = toSpeak; MainClass.ScreenReader.Say(toSpeak, true); } return; } if (__instance.forwardButton != null && __instance.forwardButton.containsPoint(x, y)) { string toSpeak = "Next Blueprint"; if (carpenterMenuQuery != toSpeak) { carpenterMenuQuery = toSpeak; MainClass.ScreenReader.Say(toSpeak, true); } return; } if (__instance.demolishButton != null && __instance.demolishButton.containsPoint(x, y)) { string toSpeak = $"Demolish Building" + (__instance.CanDemolishThis(___blueprints[___currentBlueprintIndex]) ? "" : ", cannot demolish building"); if (carpenterMenuQuery != toSpeak) { carpenterMenuQuery = toSpeak; MainClass.ScreenReader.Say(toSpeak, true); } return; } if (__instance.okButton != null && __instance.okButton.containsPoint(x, y)) { string toSpeak = "Construct Building" + (___blueprints[___currentBlueprintIndex].doesFarmerHaveEnoughResourcesToBuild() ? "" : ", cannot cunstrut building, not enough resources to build."); if (carpenterMenuQuery != toSpeak) { carpenterMenuQuery = toSpeak; MainClass.ScreenReader.Say(toSpeak, true); } return; } if (__instance.moveButton != null && __instance.moveButton.containsPoint(x, y)) { string toSpeak = "Move Building"; if (carpenterMenuQuery != toSpeak) { carpenterMenuQuery = toSpeak; MainClass.ScreenReader.Say(toSpeak, true); } return; } if (__instance.paintButton != null && __instance.paintButton.containsPoint(x, y)) { string toSpeak = "Paint Building"; if (carpenterMenuQuery != toSpeak) { carpenterMenuQuery = toSpeak; MainClass.ScreenReader.Say(toSpeak, true); } return; } if (__instance.cancelButton != null && __instance.cancelButton.containsPoint(x, y)) { string toSpeak = "Cancel Button"; if (carpenterMenuQuery != toSpeak) { carpenterMenuQuery = toSpeak; MainClass.ScreenReader.Say(toSpeak, true); } return; } } #endregion } else { if (___demolishing) { isDemolishing = true; } else if (___upgrading) { isUpgrading = true; } else if (___painting) { isPainting = true; } else if (___moving) { isMoving = true; } else { isConstructing = true; } } } catch (Exception e) { MainClass.ErrorLog($"Unable to narrate Text:\n{e.Message}\n{e.StackTrace}"); } }
// Transpiling is difficult because of the lambda and some internal compiler nonsense public static bool Prefix(CarpenterMenu __instance, int x, int y, bool playSound) { try { var __instance_freeze = Mod.instance.Helper.Reflection.GetField <bool>(__instance, "freeze"); var __instance_onFarm = Mod.instance.Helper.Reflection.GetField <bool>(__instance, "onFarm"); var __instance_moving = Mod.instance.Helper.Reflection.GetField <bool>(__instance, "moving"); var __instance_upgrading = Mod.instance.Helper.Reflection.GetField <bool>(__instance, "upgrading"); var __instance_demolishing = Mod.instance.Helper.Reflection.GetField <bool>(__instance, "demolishing"); var __instance_buildingToMove = Mod.instance.Helper.Reflection.GetField <Building>(__instance, "buildingToMove"); var __instance_currentBlueprintIndex = Mod.instance.Helper.Reflection.GetField <int>(__instance, "currentBlueprintIndex"); var __instance_price = Mod.instance.Helper.Reflection.GetField <int>(__instance, "price"); var __instance_blueprints = Mod.instance.Helper.Reflection.GetField <List <BluePrint> >(__instance, "blueprints"); if (__instance_freeze.GetValue()) { goto ret; } if (!__instance_onFarm.GetValue()) { base_receiveLeftClick(__instance, x, y, playSound); } if (__instance.cancelButton.containsPoint(x, y)) { if (!__instance_onFarm.GetValue()) { __instance.exitThisMenu(true); Game1.player.forceCanMove(); Game1.playSound("bigDeSelect"); } else { if (__instance_moving.GetValue() && __instance_buildingToMove.GetValue() != null) { Game1.playSound("cancel"); goto ret; } __instance.returnToCarpentryMenu(); Game1.playSound("smallSelect"); goto ret; } } if (!__instance_onFarm.GetValue() && __instance.backButton.containsPoint(x, y)) { __instance_currentBlueprintIndex.SetValue(__instance_currentBlueprintIndex.GetValue() - 1); if (__instance_currentBlueprintIndex.GetValue() < 0) { __instance_currentBlueprintIndex.SetValue(__instance_blueprints.GetValue().Count - 1); } __instance.setNewActiveBlueprint(); Game1.playSound("shwip"); __instance.backButton.scale = __instance.backButton.baseScale; } if (!__instance_onFarm.GetValue() && __instance.forwardButton.containsPoint(x, y)) { __instance_currentBlueprintIndex.SetValue((__instance_currentBlueprintIndex.GetValue() + 1) % __instance_blueprints.GetValue().Count); __instance.setNewActiveBlueprint(); __instance.backButton.scale = __instance.backButton.baseScale; Game1.playSound("shwip"); } if (!__instance_onFarm.GetValue() && __instance.demolishButton.containsPoint(x, y) && __instance.demolishButton.visible) { Game1.globalFadeToBlack(new Game1.afterFadeFunction(__instance.setUpForBuildingPlacement), 0.02f); Game1.playSound("smallSelect"); __instance_onFarm.SetValue(true); __instance_demolishing.SetValue(true); } if (!__instance_onFarm.GetValue() && __instance.moveButton.containsPoint(x, y) && __instance.moveButton.visible) { Game1.globalFadeToBlack(new Game1.afterFadeFunction(__instance.setUpForBuildingPlacement), 0.02f); Game1.playSound("smallSelect"); __instance_onFarm.SetValue(true); __instance_moving.SetValue(true); } if (__instance.okButton.containsPoint(x, y) && !__instance_onFarm.GetValue() && (Game1.player.Money >= __instance_price.GetValue() && __instance_blueprints.GetValue()[__instance_currentBlueprintIndex.GetValue()].doesFarmerHaveEnoughResourcesToBuild())) { Game1.globalFadeToBlack(new Game1.afterFadeFunction(__instance.setUpForBuildingPlacement), 0.02f); Game1.playSound("smallSelect"); __instance_onFarm.SetValue(true); } if (!__instance_onFarm.GetValue() || __instance_freeze.GetValue() || Game1.globalFade) { goto ret; } if (__instance_demolishing.GetValue()) { // MINE - Farm -> BuildableGameLocation BuildableGameLocation farm = CarpenterMenuTranspileCommon.ReturnCurrentLocationAnyways("Farm") as BuildableGameLocation; Building destroyed = farm.getBuildingAt(new Vector2((float)((Game1.viewport.X + Game1.getOldMouseX()) / 64), (float)((Game1.viewport.Y + Game1.getOldMouseY()) / 64))); Action buildingLockFailed = (Action)(() => { if (!__instance_demolishing.GetValue()) { return; } Game1.addHUDMessage(new HUDMessage(Game1.content.LoadString("Strings\\UI:Carpenter_CantDemolish_LockFailed"), Color.Red, 3500f)); }); Action continueDemolish = (Action)(() => { if (!__instance_demolishing.GetValue() || destroyed == null || !farm.buildings.Contains(destroyed)) { return; } if ((int)(NetFieldBase <int, NetInt>)destroyed.daysOfConstructionLeft > 0 || (int)(NetFieldBase <int, NetInt>)destroyed.daysUntilUpgrade > 0) { Game1.addHUDMessage(new HUDMessage(Game1.content.LoadString("Strings\\UI:Carpenter_CantDemolish_DuringConstruction"), Color.Red, 3500f)); } else if (destroyed.indoors.Value != null && destroyed.indoors.Value is AnimalHouse && (destroyed.indoors.Value as AnimalHouse).animalsThatLiveHere.Count > 0) { Game1.addHUDMessage(new HUDMessage(Game1.content.LoadString("Strings\\UI:Carpenter_CantDemolish_AnimalsHere"), Color.Red, 3500f)); } else if (destroyed.indoors.Value != null && destroyed.indoors.Value.farmers.Count <Farmer>() > 0) { Game1.addHUDMessage(new HUDMessage(Game1.content.LoadString("Strings\\UI:Carpenter_CantDemolish_PlayerHere"), Color.Red, 3500f)); } else { if (destroyed.indoors.Value != null && destroyed.indoors.Value is Cabin) { foreach (Character allFarmer in Game1.getAllFarmers()) { if (allFarmer.currentLocation.Name == (destroyed.indoors.Value as Cabin).GetCellarName()) { Game1.addHUDMessage(new HUDMessage(Game1.content.LoadString("Strings\\UI:Carpenter_CantDemolish_PlayerHere"), Color.Red, 3500f)); return; } } } if (destroyed.indoors.Value is Cabin && (destroyed.indoors.Value as Cabin).farmhand.Value.isActive()) { Game1.addHUDMessage(new HUDMessage(Game1.content.LoadString("Strings\\UI:Carpenter_CantDemolish_FarmhandOnline"), Color.Red, 3500f)); } else { Chest chest = (Chest)null; if (destroyed.indoors.Value is Cabin) { List <Item> objList = (destroyed.indoors.Value as Cabin).demolish(); if (objList.Count > 0) { chest = new Chest(true); chest.fixLidFrame(); chest.items.Set((IList <Item>)objList); } } if (!farm.destroyStructure(destroyed)) { return; } int tileY = (int)(NetFieldBase <int, NetInt>)destroyed.tileY; int tilesHigh = (int)(NetFieldBase <int, NetInt>)destroyed.tilesHigh; Game1.flashAlpha = 1f; destroyed.showDestroyedAnimation((GameLocation)Game1.getFarm()); Game1.playSound("explosion"); // function does nothing //Utility.spreadAnimalsAround(destroyed, farm); DelayedAction.functionAfterDelay(new DelayedAction.delayedBehavior(__instance.returnToCarpentryMenu), 1500); __instance_freeze.SetValue(true); if (chest == null) { return; } farm.objects[new Vector2((float)((int)(NetFieldBase <int, NetInt>)destroyed.tileX + (int)(NetFieldBase <int, NetInt>)destroyed.tilesWide / 2), (float)((int)(NetFieldBase <int, NetInt>)destroyed.tileY + (int)(NetFieldBase <int, NetInt>)destroyed.tilesHigh / 2))] = (StardewValley.Object)chest; } } }); if (destroyed != null) { if (destroyed.indoors.Value != null && destroyed.indoors.Value is Cabin && !Game1.IsMasterGame) { Game1.addHUDMessage(new HUDMessage(Game1.content.LoadString("Strings\\UI:Carpenter_CantDemolish_LockFailed"), Color.Red, 3500f)); destroyed = ( Building )null; goto ret; } if (!Game1.IsMasterGame && !__instance.hasPermissionsToDemolish(destroyed)) { destroyed = ( Building )null; goto ret; } } if (destroyed != null && destroyed.indoors.Value is Cabin) { Cabin cabin = destroyed.indoors.Value as Cabin; if (cabin.farmhand.Value != null && ( bool )(NetFieldBase <bool, NetBool>)cabin.farmhand.Value.isCustomized) { Game1.currentLocation.createQuestionDialogue(Game1.content.LoadString("Strings\\UI:Carpenter_DemolishCabinConfirm", ( object )cabin.farmhand.Value.Name), Game1.currentLocation.createYesNoResponses(), (GameLocation.afterQuestionBehavior)((f, answer) => { if (answer == "Yes") { Game1.activeClickableMenu = ( IClickableMenu )__instance; Game1.player.team.demolishLock.RequestLock(continueDemolish, buildingLockFailed); } else { DelayedAction.functionAfterDelay(new DelayedAction.delayedBehavior(__instance.returnToCarpentryMenu), 500); } }), ( NPC )null); goto ret; } } if (destroyed == null) { goto ret; } Game1.player.team.demolishLock.RequestLock(continueDemolish, buildingLockFailed); } else if (__instance_upgrading.GetValue()) { Building buildingAt = ((BuildableGameLocation)CarpenterMenuTranspileCommon.ReturnCurrentLocationAnyways("Farm")).getBuildingAt(new Vector2((float)((Game1.viewport.X + Game1.getOldMouseX()) / 64), (float)((Game1.viewport.Y + Game1.getOldMouseY()) / 64))); if (buildingAt != null && __instance.CurrentBlueprint.name != null && buildingAt.buildingType.Equals(( object )__instance.CurrentBlueprint.nameOfBuildingToUpgrade)) { __instance.CurrentBlueprint.consumeResources(); buildingAt.daysUntilUpgrade.Value = 2; buildingAt.showUpgradeAnimation(( GameLocation )Game1.getFarm()); Game1.playSound("axe"); DelayedAction.functionAfterDelay(new DelayedAction.delayedBehavior(__instance.returnToCarpentryMenuAfterSuccessfulBuild), 1500); __instance_freeze.SetValue(true); } else { if (buildingAt == null) { goto ret; } Game1.addHUDMessage(new HUDMessage(Game1.content.LoadString("Strings\\UI:Carpenter_CantUpgrade_BuildingType"), Color.Red, 3500f)); } } else if (__instance_moving.GetValue()) { if (__instance_buildingToMove.GetValue() == null) { __instance_buildingToMove.SetValue((( BuildableGameLocation )CarpenterMenuTranspileCommon.ReturnCurrentLocationAnyways("Farm")).getBuildingAt(new Vector2(( float )((Game1.viewport.X + Game1.getMouseX()) / 64), ( float )((Game1.viewport.Y + Game1.getMouseY()) / 64)))); if (__instance_buildingToMove.GetValue() == null) { goto ret; } if (( int )(NetFieldBase <int, NetInt>)__instance_buildingToMove.GetValue().daysOfConstructionLeft > 0) { __instance_buildingToMove.SetValue(( Building )null); } else if (!Game1.IsMasterGame && !__instance.hasPermissionsToMove(__instance_buildingToMove.GetValue())) { __instance_buildingToMove.SetValue(( Building )null); } else { __instance_buildingToMove.GetValue().isMoving = true; Game1.playSound("axchop"); } } else if ((( BuildableGameLocation )CarpenterMenuTranspileCommon.ReturnCurrentLocationAnyways("Farm")).buildStructure(__instance_buildingToMove.GetValue(), new Vector2(( float )((Game1.viewport.X + Game1.getMouseX()) / 64), ( float )((Game1.viewport.Y + Game1.getMouseY()) / 64)), Game1.player, false)) { __instance_buildingToMove.GetValue().isMoving = false; if (__instance_buildingToMove.GetValue() is ShippingBin) { (__instance_buildingToMove.GetValue() as ShippingBin).initLid(); } __instance_buildingToMove.GetValue().performActionOnBuildingPlacement(); __instance_buildingToMove.SetValue((Building)null); Game1.playSound("axchop"); DelayedAction.playSoundAfterDelay("dirtyHit", 50, ( GameLocation )null, -1); DelayedAction.playSoundAfterDelay("dirtyHit", 150, ( GameLocation )null, -1); } else { Game1.playSound("cancel"); } } else { Game1.player.team.buildLock.RequestLock(( Action )(() => { if (__instance_onFarm.GetValue() && Game1.locationRequest == null) { if (__instance.tryToBuild()) { __instance.CurrentBlueprint.consumeResources(); DelayedAction.functionAfterDelay(new DelayedAction.delayedBehavior(__instance.returnToCarpentryMenuAfterSuccessfulBuild), 2000); __instance_freeze.SetValue(true); } else { Game1.addHUDMessage(new HUDMessage(Game1.content.LoadString("Strings\\UI:Carpenter_CantBuild"), Color.Red, 3500f)); } } Game1.player.team.buildLock.ReleaseLock(); }), ( Action )null); } ret: return(false); } catch (Exception e) { return(true); } }
public static void AddBlueprint(CarpenterMenu menu) { ModEntry.GetHelper().Reflection.GetField <List <BluePrint> >(menu, "blueprints").GetValue().Add(GetComposterBlueprint()); }
/// <summary>The method to call before <see cref="CarpenterMenu.receiveLeftClick"/>.</summary> public static bool Before_ReceiveLeftClick(CarpenterMenu __instance, int x, int y, bool playSound) { // // Transpiling is difficult because of the lambda and some internal compiler nonsense // try { var __instance_freeze = Mod.Instance.Helper.Reflection.GetField <bool>(__instance, "freeze"); var __instance_onFarm = Mod.Instance.Helper.Reflection.GetField <bool>(__instance, "onFarm"); var __instance_moving = Mod.Instance.Helper.Reflection.GetField <bool>(__instance, "moving"); var __instance_upgrading = Mod.Instance.Helper.Reflection.GetField <bool>(__instance, "upgrading"); var __instance_demolishing = Mod.Instance.Helper.Reflection.GetField <bool>(__instance, "demolishing"); var __instance_buildingToMove = Mod.Instance.Helper.Reflection.GetField <Building>(__instance, "buildingToMove"); var __instance_currentBlueprintIndex = Mod.Instance.Helper.Reflection.GetField <int>(__instance, "currentBlueprintIndex"); var __instance_price = Mod.Instance.Helper.Reflection.GetField <int>(__instance, "price"); var __instance_blueprints = Mod.Instance.Helper.Reflection.GetField <List <BluePrint> >(__instance, "blueprints"); if (__instance_freeze.GetValue()) { goto ret; } if (!__instance_onFarm.GetValue()) { CarpenterMenuPatcher.base_receiveLeftClick(__instance, x, y, playSound); } if (__instance.cancelButton.containsPoint(x, y)) { if (!__instance_onFarm.GetValue()) { __instance.exitThisMenu(); Game1.player.forceCanMove(); Game1.playSound("bigDeSelect"); } else { if (__instance_moving.GetValue() && __instance_buildingToMove.GetValue() != null) { Game1.playSound("cancel"); goto ret; } __instance.returnToCarpentryMenu(); Game1.playSound("smallSelect"); goto ret; } } if (!__instance_onFarm.GetValue() && __instance.backButton.containsPoint(x, y)) { __instance_currentBlueprintIndex.SetValue(__instance_currentBlueprintIndex.GetValue() - 1); if (__instance_currentBlueprintIndex.GetValue() < 0) { __instance_currentBlueprintIndex.SetValue(__instance_blueprints.GetValue().Count - 1); } __instance.setNewActiveBlueprint(); Game1.playSound("shwip"); __instance.backButton.scale = __instance.backButton.baseScale; } if (!__instance_onFarm.GetValue() && __instance.forwardButton.containsPoint(x, y)) { __instance_currentBlueprintIndex.SetValue((__instance_currentBlueprintIndex.GetValue() + 1) % __instance_blueprints.GetValue().Count); __instance.setNewActiveBlueprint(); __instance.backButton.scale = __instance.backButton.baseScale; Game1.playSound("shwip"); } if (!__instance_onFarm.GetValue() && __instance.demolishButton.containsPoint(x, y) && __instance.demolishButton.visible) { Game1.globalFadeToBlack(__instance.setUpForBuildingPlacement); Game1.playSound("smallSelect"); __instance_onFarm.SetValue(true); __instance_demolishing.SetValue(true); } if (!__instance_onFarm.GetValue() && __instance.moveButton.containsPoint(x, y) && __instance.moveButton.visible) { Game1.globalFadeToBlack(__instance.setUpForBuildingPlacement); Game1.playSound("smallSelect"); __instance_onFarm.SetValue(true); __instance_moving.SetValue(true); } if (__instance.okButton.containsPoint(x, y) && !__instance_onFarm.GetValue() && (Game1.player.Money >= __instance_price.GetValue() && __instance_blueprints.GetValue()[__instance_currentBlueprintIndex.GetValue()].doesFarmerHaveEnoughResourcesToBuild())) { Game1.globalFadeToBlack(__instance.setUpForBuildingPlacement); Game1.playSound("smallSelect"); __instance_onFarm.SetValue(true); } if (!__instance_onFarm.GetValue() || __instance_freeze.GetValue() || Game1.globalFade) { goto ret; } if (__instance_demolishing.GetValue()) { // MINE - Farm -> BuildableGameLocation BuildableGameLocation farm = CarpenterMenuPatcher.ReturnCurrentLocationAnyways("Farm") as BuildableGameLocation; Building destroyed = farm.getBuildingAt(new Vector2((Game1.viewport.X + Game1.getOldMouseX()) / 64, (Game1.viewport.Y + Game1.getOldMouseY()) / 64)); void BuildingLockFailed() { if (!__instance_demolishing.GetValue()) { return; } Game1.addHUDMessage(new HUDMessage(Game1.content.LoadString("Strings\\UI:Carpenter_CantDemolish_LockFailed"), Color.Red, 3500f)); } void ContinueDemolish() { if (!__instance_demolishing.GetValue() || destroyed == null || !farm.buildings.Contains(destroyed)) { return; } if (destroyed.daysOfConstructionLeft.Value > 0 || destroyed.daysUntilUpgrade.Value > 0) { Game1.addHUDMessage(new HUDMessage(Game1.content.LoadString("Strings\\UI:Carpenter_CantDemolish_DuringConstruction"), Color.Red, 3500f)); } else if (destroyed.indoors.Value is AnimalHouse house && house.animalsThatLiveHere.Count > 0) { Game1.addHUDMessage(new HUDMessage(Game1.content.LoadString("Strings\\UI:Carpenter_CantDemolish_AnimalsHere"), Color.Red, 3500f)); } else if (destroyed.indoors.Value != null && destroyed.indoors.Value.farmers.Any()) { Game1.addHUDMessage(new HUDMessage(Game1.content.LoadString("Strings\\UI:Carpenter_CantDemolish_PlayerHere"), Color.Red, 3500f)); } else { if (destroyed.indoors.Value is Cabin cabin) { foreach (Farmer allFarmer in Game1.getAllFarmers()) { if (allFarmer.currentLocation.Name == cabin.GetCellarName()) { Game1.addHUDMessage(new HUDMessage(Game1.content.LoadString("Strings\\UI:Carpenter_CantDemolish_PlayerHere"), Color.Red, 3500f)); return; } } } if (destroyed.indoors.Value is Cabin cabinA && cabinA.farmhand.Value.isActive()) { Game1.addHUDMessage(new HUDMessage(Game1.content.LoadString("Strings\\UI:Carpenter_CantDemolish_FarmhandOnline"), Color.Red, 3500f)); } else { Chest chest = null; if (destroyed.indoors.Value is Cabin cabinB) { List <Item> objList = cabinB.demolish(); if (objList.Count > 0) { chest = new Chest(true); chest.fixLidFrame(); chest.items.Set(objList); } } if (!farm.destroyStructure(destroyed)) { return; } Game1.flashAlpha = 1f; destroyed.showDestroyedAnimation(Game1.getFarm()); Game1.playSound("explosion"); // function does nothing //Utility.spreadAnimalsAround(destroyed, farm); DelayedAction.functionAfterDelay(__instance.returnToCarpentryMenu, 1500); __instance_freeze.SetValue(true); if (chest == null) { return; } farm.objects[new Vector2(destroyed.tileX.Value + destroyed.tilesWide.Value / 2, destroyed.tileY.Value + destroyed.tilesHigh.Value / 2)] = chest; } }
static void Display_RenderedActiveMenu(object sender, RenderedActiveMenuEventArgs e) { if (!(Game1.activeClickableMenu is CarpenterMenu)) { return; } CarpenterMenu carpenterMenu = (CarpenterMenu)Game1.activeClickableMenu; bool onFarm = Helper.Reflection.GetField <bool>(carpenterMenu, "onFarm").GetValue(); if (onFarm) { return; } moneyButton.draw(e.SpriteBatch); if (moneyButtonEnabled && setupBlueprints) { cancelTexture.draw(e.SpriteBatch, Color.Gray, 0.88f); Vector2 vector = new Vector2((float)(carpenterMenu.xPositionOnScreen + carpenterMenu.maxWidthOfDescription + 16 + 64), (float)(carpenterMenu.yPositionOnScreen + 256 + 32)); vector.X -= 16f; vector.Y -= 21f; List <Item> ingredients = Helper.Reflection.GetField <List <Item> >(carpenterMenu, "ingredients").GetValue(); bool magicalConstruction = Helper.Reflection.GetField <bool>(carpenterMenu, "magicalConstruction").GetValue(); vector.Y += 68f * ingredients.Count; int currentBlueprintIndex = Helper.Reflection.GetField <int>(carpenterMenu, "currentBlueprintIndex").GetValue(); Item ingredient; if (GetRequired(vanillaBlueprints[currentBlueprintIndex], woodObject) > 0) { vector.Y += 68f; ingredient = woodObject.getOne(); ingredient.Stack = remainingWoodReq; ingredient.drawInMenu(e.SpriteBatch, vector, 1f); Utility.drawTextWithShadow(e.SpriteBatch, ingredInfoWood, Game1.dialogueFont, new Vector2(vector.X + 64f + 16f, vector.Y + 20f), magicalConstruction ? Color.PaleGoldenrod : Game1.textColor, 1f, -1f, -1, -1, magicalConstruction ? 0f : 0.25f, 3); if (ingredient.Stack == 0) { Utility.drawTinyDigits(0, e.SpriteBatch, vector + new Vector2((float)(64 - Utility.getWidthOfTinyDigitString(0, 3f * 1f)) + 3f * 1f, 64f - 18f * 1f + 2f), 3f * 1f, 1f, Color.White); } } if (GetRequired(vanillaBlueprints[currentBlueprintIndex], stoneObject) > 0) { vector.Y += 68f; ingredient = stoneObject.getOne(); ingredient.Stack = remainingStoneReq; ingredient.drawInMenu(e.SpriteBatch, vector, 1f); Utility.drawTextWithShadow(e.SpriteBatch, ingredInfoStone, Game1.dialogueFont, new Vector2(vector.X + 64f + 16f, vector.Y + 20f), magicalConstruction ? Color.PaleGoldenrod : Game1.textColor, 1f, -1f, -1, -1, magicalConstruction ? 0f : 0.25f, 3); if (ingredient.Stack == 0) { Utility.drawTinyDigits(0, e.SpriteBatch, vector + new Vector2((float)(64 - Utility.getWidthOfTinyDigitString(0, 3f * 1f)) + 3f * 1f, 64f - 18f * 1f + 2f), 3f * 1f, 1f, Color.White); } } } //draw mosue and hover text above everything again carpenterMenu.drawMouse(e.SpriteBatch); string hoverText = Helper.Reflection.GetField <string>(carpenterMenu, "hoverText").GetValue(); if (hoverText.Length > 0) { IClickableMenu.drawHoverText(e.SpriteBatch, hoverText, Game1.dialogueFont, 0, 0, -1, null, -1, null, null, 0, -1, -1, -1, -1, 1f, null); } }
public static bool IsUpgradingPlacementMode(this CarpenterMenu menu) { var reflector = StaticReflectionHelper.GetInstance().GetReflector(); return(reflector.GetField <bool>(menu, "upgrading").GetValue() && menu.InPlacementMode()); }
public static bool InPlacementMode(this CarpenterMenu menu) { var reflector = StaticReflectionHelper.GetInstance().GetReflector(); return(reflector.GetField <bool>(menu, "onFarm").GetValue()); }
// BUG: player warps back to wizard hut after use private void OpenJunimoHutMenu() { var menu = new CarpenterMenu(true); var blueprints = Helper.Reflection.GetField <List <BluePrint> >(menu, "blueprints"); var newBluePrints = new List <BluePrint> { new("Junimo Hut") }; blueprints.SetValue(newBluePrints); Game1.activeClickableMenu = menu; } /// <summary>Raised after a game menu is opened, closed, or replaced.</summary> /// <param name="sender">The event sender.</param> /// <param name="e">The event arguments.</param> void OnMenuChanged(object sender, MenuChangedEventArgs e) { // closed Junimo Hut menu // // check that e.NewMenu is null because this event also fires when items are added to the chest // caution: this runs after any chest is closed, not just Junimo huts // closed menu if (e.OldMenu is ItemGrabMenu menu && e.NewMenu is null) { if (menu.context is not(JunimoHut or Chest)) { return; } if (menu.context is Chest chest && !chest.modData.ContainsKey($"{ModManifest.UniqueID}/JunimoChest")) { return; } CheckHutsForWagesAndProgressionItems(); JunimoAbilities.ResetCooldowns(); } // opened menu if (e.OldMenu != null || e.NewMenu is not CarpenterMenu) { return; } if (!Helper.Reflection.GetField <bool>(e.NewMenu, "magicalConstruction").GetValue()) { return; } // limit to only junimo hut if (!Game1.MasterPlayer.mailReceived.Contains("hasPickedUpMagicInk")) { OpenJunimoHutMenu(); } } /// <summary>Raised after the game begins a new day (including when the player loads a save).</summary> /// <param name="sender">The event sender.</param> /// <param name="e">The event arguments.</param> void OnDayStarted(object sender, DayStartedEventArgs e) { if (Config.JunimoPayment.WorkForWages) { Util.Payments.JunimoPaymentsToday.Clear(); Util.Payments.WereJunimosPaidToday = false; } var huts = Game1.getFarm().buildings.OfType <JunimoHut>().ToList(); // tag each hut chest so later we can tell whether a GrabMenu close is for a Junimo chest or some other chest foreach (var hut in huts) { hut.output.Value.modData[$"{ModManifest.UniqueID}/JunimoChest"] = "true"; } if (huts.Any()) { CheckHutsForWagesAndProgressionItems(); Util.Progression.DayStartedProgressionPrompt(Game1.IsWinter, Game1.isRaining); JunimoAbilities.ResetCooldowns(); } foreach (var location in Game1.locations) { var toRemove = location.characters.Where(npc => npc is JunimoHarvester).ToList(); if (toRemove.Count > 0) { Monitor.Log($"{location.Name} has {toRemove.Count} Junimos", LogLevel.Trace); } foreach (var npc in toRemove) { var junimo = (JunimoHarvester)npc; Monitor.Log($" Removing Junimo {junimo.whichJunimoFromThisHut} from {location.Name}", LogLevel.Trace); location.characters.Remove(npc); } } // reset for rainy days, winter, or Generic Mod Config Menu options change SaveConfig(); }
private static void Input_ButtonPressed(object sender, ButtonPressedEventArgs e) { if (!(Game1.activeClickableMenu is CarpenterMenu)) { return; } CarpenterMenu carpenterMenu = (CarpenterMenu)Game1.activeClickableMenu; if (!setupBlueprints) { SetupBlueprints(carpenterMenu); } if (!e.Button.Equals(SButton.MouseLeft)) { return; } Helper.Input.Suppress(e.Button); int X = Game1.getMouseX(); int Y = Game1.getMouseY(); bool onFarm = Helper.Reflection.GetField <bool>(carpenterMenu, "onFarm").GetValue(); if (!onFarm && moneyButton.containsPoint(X, Y)) { moneyButtonEnabled = !moneyButtonEnabled; } if (onFarm && moneyButtonEnabled) { bool demolishing = Helper.Reflection.GetField <bool>(carpenterMenu, "demolishing").GetValue(); bool moving = Helper.Reflection.GetField <bool>(carpenterMenu, "moving").GetValue(); if (demolishing || moving) { moneyButtonEnabled = false; } else { Monitor.Log("CarpenterMenu: setting saleBlueprint", LogLevel.Trace); Helper.Reflection.GetField <List <BluePrint> >(carpenterMenu, "blueprints").SetValue(saleBlueprints); carpenterMenu.setNewActiveBlueprint(); } } Monitor.Log("carpenterMenu.receiveLeftClick", LogLevel.Trace); carpenterMenu.receiveLeftClick(X, Y); if (!onFarm && moneyButtonEnabled) { Monitor.Log("CarpenterMenu: setting modBlueprint", LogLevel.Trace); Helper.Reflection.GetField <List <BluePrint> >(carpenterMenu, "blueprints").SetValue(modBlueprints); carpenterMenu.setNewActiveBlueprint(); int currentBlueprintIndex = Helper.Reflection.GetField <int>(carpenterMenu, "currentBlueprintIndex").GetValue(); remainingWoodReq = GetRequired(vanillaBlueprints[currentBlueprintIndex], woodObject) - InventoryAmount(woodObject.Name); remainingStoneReq = GetRequired(vanillaBlueprints[currentBlueprintIndex], stoneObject) - InventoryAmount(stoneObject.Name); } if (!moneyButtonEnabled && setupBlueprints) { Monitor.Log("CarpenterMenu: setting vanillaBlueprint", LogLevel.Trace); Helper.Reflection.GetField <List <BluePrint> >(carpenterMenu, "blueprints").SetValue(vanillaBlueprints); carpenterMenu.setNewActiveBlueprint(); } }