示例#1
0
        /// <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);
            }
        }
示例#2
0
        /// <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);
        }
示例#3
0
 /// <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();
         }
     }
 }
示例#4
0
        /// <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
                }
            }
        }
示例#5
0
        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;
        }
示例#6
0
        // 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;
        }
示例#7
0
        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;
            }
        }
示例#9
0
        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);
            }
        }
示例#10
0
        /// <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);
        }
示例#11
0
        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]);
            }
        }
示例#13
0
 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();
     }
 }
示例#14
0
 private static bool HasBluePrint(CarpenterMenu carpenterMenu)
 {
     return(GetBluePrints(carpenterMenu).Exists(bluePrint => bluePrint.name == WOODS_OBELISK_BUILDING_NAME));
 }
示例#15
0
 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));
 }
示例#16
0
 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);
            }
        }
示例#19
0
 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);
            }
        }
示例#22
0
        public static bool IsUpgradingPlacementMode(this CarpenterMenu menu)
        {
            var reflector = StaticReflectionHelper.GetInstance().GetReflector();

            return(reflector.GetField <bool>(menu, "upgrading").GetValue() && menu.InPlacementMode());
        }
示例#23
0
        public static bool InPlacementMode(this CarpenterMenu menu)
        {
            var reflector = StaticReflectionHelper.GetInstance().GetReflector();

            return(reflector.GetField <bool>(menu, "onFarm").GetValue());
        }
示例#24
0
        // 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();
            }
        }