private void Events_CallingTileActionShops(object sender, PlatoTK.Events.ICallingTileActionEventArgs e)
 {
     if (e.Trigger == "MapTKShop" && e.Parameter.Length > 0)
     {
         OpenMapTKShop(e.Parameter[0]);
     }
 }
 private void Events_CallingTileActionLua(object sender, PlatoTK.Events.ICallingTileActionEventArgs e)
 {
     if (e.Trigger == "L#")
     {
         CallLua(e);
         e.TakeOver(true);
     }
 }
 private void Events_CallingTileActionReloadMap(object sender, PlatoTK.Events.ICallingTileActionEventArgs e)
 {
     if (e.Trigger == "ReloadMap")
     {
         Plato.Utilities.ReloadMap(e.Location);
         e.TakeOver(true);
     }
 }
        private void Events_CallingTileActionDropIn(object sender, PlatoTK.Events.ICallingTileActionEventArgs e)
        {
            Farmer       who      = e.Caller ?? Game1.player;
            GameLocation location = e.Location ?? Game1.currentLocation;

            if (e.Trigger == "DropIn" &&
                (who?.IsLocalPlayer ?? false))
            {
                if (who.ActiveObject is StardewValley.Object o)
                {
                    Func <StardewValley.Object, bool> validate;

                    int stack = 1;

                    if (int.TryParse(e.Parameter[0], out int s))
                    {
                        stack = s;
                    }

                    if (e.Parameter[1] == "L#")
                    {
                        validate = (obj) => (bool)CallLua(e, obj, 2).Globals["result"];
                    }
                    else
                    {
                        validate = (obj) => e.Parameter[1] == obj.Name ||
                                   (int.TryParse(e.Parameter[1], out int index) && (index == obj.ParentSheetIndex || obj.Category == index));
                    }

                    if (who.ActiveObject.Stack >= stack && validate(o))
                    {
                        who.ActiveObject.Stack -= s;
                        if (who.ActiveObject.Stack <= 0)
                        {
                            who.removeItemFromInventory(who.ActiveObject);
                            who.ActiveObject = null;

                            if (e.Tile != null && e.Tile.Properties.TryGetValue("@DropIn_Success", out PropertyValue value))
                            {
                                location?.performAction(value.ToString(), who, new xTile.Dimensions.Location(e.Position.X, e.Position.Y));
                            }
                        }
                        else if (e.Tile != null && e.Tile.Properties.TryGetValue("@DropIn_Failure", out PropertyValue value))
                        {
                            location?.performAction(value.ToString(), who, new xTile.Dimensions.Location(e.Position.X, e.Position.Y));
                        }
                    }
                }
                else if (e.Tile != null && e.Tile.Properties.TryGetValue("@DropIn_Default", out PropertyValue value))
                {
                    (e.Location ?? Game1.currentLocation).performAction(value.ToString(), who, new xTile.Dimensions.Location(e.Position.X, e.Position.Y));
                }
            }
        }
        private MoonSharp.Interpreter.Script CallLua(PlatoTK.Events.ICallingTileActionEventArgs e, StardewValley.Object input = null, int skipParams = 0)
        {
            string[] parameter = e.Parameter.Skip(skipParams).ToArray();
            string   codeId    = parameter[0];
            Tile     tile      = e.Tile;
            string   code;
            string   function = null;

            if (codeId == "this")
            {
                string propertyId = parameter[1];
                code = tile.Properties[$"@Lua_{propertyId}"].ToString();


                if (parameter.Length > 2)
                {
                    function = parameter[2].ToString();
                }
                else
                {
                    code     = $"function callthis(location,tile,layer) {code} end";
                    function = "callthis";
                }
            }
            else
            {
                code = Plato.ModHelper.Content.Load <Dictionary <string, string> >(LuaScriptRepository, ContentSource.GameContent)[codeId];
                if (parameter.Length > 1)
                {
                    function = parameter[1];
                }
            }
            Dictionary <string, object> inputDict = null;

            if (input != null)
            {
                inputDict = new Dictionary <string, object>()
                {
                    { "input", input }
                }
            }
            ;

            var lua = Plato.Lua.LoadLuaCode(code, inputDict);

            if (!string.IsNullOrEmpty(function))
            {
                lua.Call(lua.Globals[function], e.Location, Utility.PointToVector2(e.Position), e.Layer.Id, e);
            }

            return(lua);
        }
    }
 private void Events_CallingTileActionFlag(object sender, PlatoTK.Events.ICallingTileActionEventArgs e)
 {
     if (Game1.MasterPlayer is Farmer who)
     {
         if (e.Trigger == "SetFlag" && !who.hasOrWillReceiveMail(e.Parameter[0]))
         {
             who.mailReceived.Add(e.Parameter[0]);
         }
         else if (e.Trigger == "UnsetFlag" && who.hasOrWillReceiveMail(e.Parameter[0]))
         {
             who.mailReceived.Remove(e.Parameter[0]);
         }
     }
 }