public static bool checkAction_Prefix(ref GameLocation __instance, Location tileLocation, xTile.Dimensions.Rectangle viewport, Farmer who, ref bool __result)
        {
            GameLocation location = __instance;
            ModHooks     hooks    = (ModHooks)typeof(Game1).GetField("hooks", BindingFlags.NonPublic | BindingFlags.Static).GetValue(null);

            __result = hooks.OnGameLocation_CheckAction(__instance, tileLocation, viewport, who, delegate
            {
                if (who.IsSitting())
                {
                    who.StopSitting();
                    return(true);
                }
                Microsoft.Xna.Framework.Rectangle value = new Microsoft.Xna.Framework.Rectangle(tileLocation.X * 64, tileLocation.Y * 64, 64, 64);
                foreach (Farmer current in location.farmers)
                {
                    if (current != Game1.player && current.GetBoundingBox().Intersects(value) && current.checkAction(who, location))
                    {
                        return(true);
                    }
                }
                if (location.currentEvent != null && location.currentEvent.isFestival)
                {
                    return(location.currentEvent.checkAction(tileLocation, viewport, who));
                }
                foreach (NPC current2 in location.characters)
                {
                    if (current2 != null && !current2.IsMonster && (!who.isRidingHorse() || !(current2 is Horse)) && current2.GetBoundingBox().Intersects(value) && current2.checkAction(who, location))
                    {
                        if (who.FarmerSprite.IsPlayingBasicAnimation(who.FacingDirection, carrying: false) || who.FarmerSprite.IsPlayingBasicAnimation(who.FacingDirection, carrying: true))
                        {
                            who.faceGeneralDirection(current2.getStandingPosition(), 0, opposite: false, useTileCalculations: false);
                        }
                        return(true);
                    }
                }
                if (who.IsLocalPlayer && who.currentUpgrade != null && location.name.Equals("Farm") && tileLocation.Equals(new Location((int)(who.currentUpgrade.positionOfCarpenter.X + 32f) / 64, (int)(who.currentUpgrade.positionOfCarpenter.Y + 32f) / 64)))
                {
                    if (who.currentUpgrade.daysLeftTillUpgradeDone == 1)
                    {
                        Game1.drawDialogue(Game1.getCharacterFromName("Robin"), Game1.content.LoadString("Data\\ExtraDialogue:Farm_RobinWorking_ReadyTomorrow"));
                    }
                    else
                    {
                        Game1.drawDialogue(Game1.getCharacterFromName("Robin"), Game1.content.LoadString("Data\\ExtraDialogue:Farm_RobinWorking" + (Game1.random.Next(2) + 1)));
                    }
                }
                foreach (ResourceClump current3 in location.resourceClumps)
                {
                    if (current3.getBoundingBox(current3.tile).Intersects(value) && current3.performUseAction(new Vector2(tileLocation.X, tileLocation.Y), location))
                    {
                        return(true);
                    }
                }
                Vector2 vector = new Vector2(tileLocation.X, tileLocation.Y);
                if (location.objects.ContainsKey(vector) && location.objects[vector].Type != null)
                {
                    if (who.isRidingHorse() && !(location.objects[vector] is Fence))
                    {
                        return(false);
                    }
                    if (vector.Equals(who.getTileLocation()) && !location.objects[vector].isPassable())
                    {
                        Tool tool = new Pickaxe();
                        tool.DoFunction(Game1.currentLocation, -1, -1, 0, who);
                        if (location.objects[vector].performToolAction(tool, location))
                        {
                            location.objects[vector].performRemoveAction(location.objects[vector].tileLocation, Game1.currentLocation);
                            location.objects[vector].dropItem(location, who.GetToolLocation(), new Vector2(who.GetBoundingBox().Center.X, who.GetBoundingBox().Center.Y));
                            Game1.currentLocation.Objects.Remove(vector);
                            return(true);
                        }
                        tool = new Axe();
                        tool.DoFunction(Game1.currentLocation, -1, -1, 0, who);
                        if (location.objects.ContainsKey(vector) && location.objects[vector].performToolAction(tool, location))
                        {
                            location.objects[vector].performRemoveAction(location.objects[vector].tileLocation, Game1.currentLocation);
                            location.objects[vector].dropItem(location, who.GetToolLocation(), new Vector2(who.GetBoundingBox().Center.X, who.GetBoundingBox().Center.Y));
                            Game1.currentLocation.Objects.Remove(vector);
                            return(true);
                        }
                        if (!location.objects.ContainsKey(vector))
                        {
                            return(true);
                        }
                    }
                    if (location.objects.ContainsKey(vector) && (location.objects[vector].Type.Equals("Crafting") || location.objects[vector].Type.Equals("interactive")))
                    {
                        if (who.ActiveObject == null && location.objects[vector].checkForAction(who))
                        {
                            return(true);
                        }
                        if (location.objects.ContainsKey(vector))
                        {
                            if (who.CurrentItem != null)
                            {
                                StardewValley.Object value2 = location.objects[vector].heldObject.Value;
                                location.objects[vector].heldObject.Value = null;
                                bool flag = location.objects[vector].performObjectDropInAction(who.CurrentItem, probe: true, who);
                                location.objects[vector].heldObject.Value = value2;
                                bool flag2 = location.objects[vector].performObjectDropInAction(who.CurrentItem, probe: false, who);
                                if ((flag | flag2) && who.isMoving())
                                {
                                    Game1.haltAfterCheck = false;
                                }
                                if (flag2)
                                {
                                    who.reduceActiveItemByOne();
                                    return(true);
                                }
                                return(location.objects[vector].checkForAction(who) | flag);
                            }
                            return(location.objects[vector].checkForAction(who));
                        }
                    }
                    else if (location.objects.ContainsKey(vector) && (bool)location.objects[vector].isSpawnedObject)
                    {
                        int quality   = location.objects[vector].quality;
                        Random random = new Random((int)Game1.uniqueIDForThisGame / 2 + (int)Game1.stats.DaysPlayed + (int)vector.X + (int)vector.Y * 777);
                        if (who.professions.Contains(16) && location.objects[vector].isForage(location))
                        {
                            location.objects[vector].Quality = 4;
                        }
                        else if (location.objects[vector].isForage(location))
                        {
                            if (random.NextDouble() < (double)((float)who.ForagingLevel / 30f))
                            {
                                location.objects[vector].Quality = 2;
                            }
                            else if (random.NextDouble() < (double)((float)who.ForagingLevel / 15f))
                            {
                                location.objects[vector].Quality = 1;
                            }
                        }
                        if ((bool)location.objects[vector].questItem && location.objects[vector].questId.Value != 0 && !who.hasQuest(location.objects[vector].questId))
                        {
                            return(false);
                        }
                        if (who.couldInventoryAcceptThisItem(location.objects[vector]))
                        {
                            if (who.IsLocalPlayer)
                            {
                                location.localSound("pickUpItem");
                                DelayedAction.playSoundAfterDelay("coin", 300);
                            }
                            who.animateOnce(279 + who.FacingDirection);
                            if (!location.isFarmBuildingInterior())
                            {
                                if (location.objects[vector].isForage(location))
                                {
                                    who.gainExperience(2, 7);
                                }
                            }
                            else
                            {
                                who.gainExperience(0, 5);
                            }
                            who.addItemToInventoryBool(location.objects[vector].getOne());
                            Game1.stats.ItemsForaged++;
                            if (who.professions.Contains(13) && random.NextDouble() < 0.2 && !location.objects[vector].questItem && who.couldInventoryAcceptThisItem(location.objects[vector]) && !location.isFarmBuildingInterior())
                            {
                                who.addItemToInventoryBool(location.objects[vector].getOne());
                                who.gainExperience(2, 7);
                            }
                            location.objects.Remove(vector);
                            return(true);
                        }
                        location.objects[vector].Quality = quality;
                    }
                }
                if (who.isRidingHorse())
                {
                    who.mount.checkAction(who, location);
                    return(true);
                }
                foreach (MapSeat current4 in location.mapSeats)
                {
                    if (current4.OccupiesTile(tileLocation.X, tileLocation.Y) && !current4.IsBlocked(location))
                    {
                        who.BeginSitting(current4);
                        return(true);
                    }
                }
                foreach (KeyValuePair <Vector2, TerrainFeature> current5 in location.terrainFeatures.Pairs)
                {
                    if (current5.Value.getBoundingBox(current5.Key).Intersects(value) && current5.Value.performUseAction(current5.Key, location))
                    {
                        Game1.haltAfterCheck = false;
                        return(true);
                    }
                }
                if (location.largeTerrainFeatures != null)
                {
                    foreach (LargeTerrainFeature current6 in location.largeTerrainFeatures)
                    {
                        if (current6.getBoundingBox().Intersects(value) && current6.performUseAction(current6.tilePosition, location))
                        {
                            Game1.haltAfterCheck = false;
                            return(true);
                        }
                    }
                }
                string text = null;
                Tile tile   = location.map.GetLayer("Buildings").PickTile(new Location(tileLocation.X * 64, tileLocation.Y * 64), viewport.Size);
                if (tile != null)
                {
                    tile.Properties.TryGetValue("Action", out PropertyValue value3);
                    if (value3 != null)
                    {
                        text = value3.ToString();
                    }
                }
                if (text == null)
                {
                    text = location.doesTileHaveProperty(tileLocation.X, tileLocation.Y, "Action", "Buildings");
                }
                NPC nPC = location.isCharacterAtTile(vector + new Vector2(0f, 1f));
                if (text != null)
                {
                    if (location.currentEvent == null && nPC != null && !nPC.IsInvisible && !nPC.IsMonster && (!who.isRidingHorse() || !(nPC is Horse)) && Utility.withinRadiusOfPlayer(nPC.getStandingX(), nPC.getStandingY(), 1, who) && nPC.checkAction(who, location))
                    {
                        if (who.FarmerSprite.IsPlayingBasicAnimation(who.FacingDirection, who.IsCarrying()))
                        {
                            who.faceGeneralDirection(nPC.getStandingPosition(), 0, opposite: false, useTileCalculations: false);
                        }
                        return(true);
                    }
                    return(location.performAction(text, who, tileLocation));
                }
                if (tile != null && location.checkTileIndexAction(tile.TileIndex))
                {
                    return(true);
                }
                Point value4 = new Point(tileLocation.X * 64, (tileLocation.Y - 1) * 64);
                bool flag3   = Game1.didPlayerJustRightClick();
                foreach (Furniture current7 in location.furniture)
                {
                    if (current7.boundingBox.Value.Contains((int)(vector.X * 64f), (int)(vector.Y * 64f)) && (int)current7.furniture_type != 12)
                    {
                        if (flag3)
                        {
                            if (who.ActiveObject != null && current7.performObjectDropInAction(who.ActiveObject, probe: false, who))
                            {
                                return(true);
                            }

                            if (who.CurrentTool != null && (who.CurrentTool is MeleeWeapon || who.CurrentTool is Slingshot) && current7.performObjectDropInAction(who.CurrentTool, probe: false, who))
                            {
                                return(true);
                            }
                            return(current7.checkForAction(who));
                        }
                        return(current7.clicked(who));
                    }
                    if ((int)current7.furniture_type == 6 && current7.boundingBox.Value.Contains(value4))
                    {
                        if (flag3)
                        {
                            if (who.ActiveObject != null && current7.performObjectDropInAction(who.ActiveObject, probe: false, who))
                            {
                                return(true);
                            }
                            return(current7.checkForAction(who));
                        }
                        return(current7.clicked(who));
                    }
                }
                return(false);
            });
Ejemplo n.º 2
0
        private static void checkAction_Postfix(GameLocation __instance, ref bool __result, Location tileLocation, xTile.Dimensions.Rectangle viewport, Farmer who)
        {
            if (!Config.EnableMod || __result)
            {
                return;
            }

            //SMonitor.Log($"Checking for seat");

            foreach (Object obj in __instance.objects.Values)
            {
                if (obj.TileLocation == new Vector2(tileLocation.X, tileLocation.Y) && Config.SeatTypes.Contains(obj.name))
                {
                    SMonitor.Log($"Got object seat");
                    MapSeat ms = new MapSeat();
                    ms.tilePosition.Value = new Vector2(tileLocation.X, tileLocation.Y);
                    ms.seatType.Value     = "stool expert sitting mod";
                    ms.size.Value         = new Vector2(1, 1);
                    __instance.mapSeats.Add(ms);
                    who.BeginSitting(ms);
                    __result = true;
                    break;
                }
            }
            if (__result)
            {
                return;
            }

            foreach (ResourceClump rc in __instance.resourceClumps)
            {
                if (rc.occupiesTile(tileLocation.X, tileLocation.Y - 1))
                {
                    SMonitor.Log($"Got clump seat");
                    MapSeat ms = new MapSeat();
                    ms.tilePosition.Value = new Vector2(tileLocation.X, tileLocation.Y);
                    ms.seatType.Value     = "clump expert sitting mod";
                    switch (who.FacingDirection)
                    {
                    case 0:
                    case 2:
                        ms.direction.Value = 2;
                        break;

                    default:
                        if (rc.occupiesTile(tileLocation.X - 1, tileLocation.Y - 1))
                        {
                            ms.direction.Value = 1;
                        }
                        else
                        {
                            ms.direction.Value = 3;
                        }
                        break;
                    }
                    ms.size.Value = new Vector2(1, 1);
                    __instance.mapSeats.Add(ms);
                    who.BeginSitting(ms);
                    __result = true;
                    break;
                }
            }

            if (__result)
            {
                return;
            }

            if (Config.AllowMapSit && (Config.MapSitModKey == SButton.None || context.Helper.Input.IsDown(Config.MapSitModKey)) && __instance.map.GetLayer("Buildings")?.PickTile(tileLocation * Game1.tileSize, Game1.viewport.Size) != null && __instance.map.GetLayer("Building")?.PickTile(new Location(tileLocation.X, tileLocation.Y + 1) * Game1.tileSize, Game1.viewport.Size) == null)
            {
                SMonitor.Log($"Got map seat");
                MapSeat ms = new MapSeat();
                ms.tilePosition.Value = new Vector2(tileLocation.X, tileLocation.Y);
                ms.size.Value         = new Vector2(1, 1);
                ms.seatType.Value     = "map expert sitting mod";
                __instance.mapSeats.Add(ms);
                ms.direction.Value = 2;
                who.BeginSitting(ms);
                __result = true;
            }
        }