private void OnSaving(object sender, SavingEventArgs args)
        {
            int          counter         = 0;
            GameLocation choosenLocation = null;//locationsList[0];

            for (int i = 0; i < Game1.locations.Count; i++)
            {
                if (Game1.locations[i] != null && Game1.locations[i].name.Equals("YourLocationName"))
                {
                    this.Monitor.Log($"{Game1.locations[i].name} es wurde eine Location in Game1.Locations gefunden mit dem Passenden Namen!", LogLevel.Warn);
                    choosenLocation = Game1.locations[i];
                    counter++;
                }
            }

            this.Monitor.Log($"{counter} mal wurde die Location in Locations gefunden!", LogLevel.Warn);

            GameLocationStruct locationStruct = saveDataPrepare(choosenLocation);

            this.Monitor.Log($"{Game1.player.Name} JSON wird gesaved!", LogLevel.Warn);

            string dataString;

            using (StringWriter textWriter = new StringWriter())
            {
                locationSerializer.Serialize(textWriter, locationStruct);
                dataString = textWriter.ToString();
            }
            Helper.Data.WriteSaveData("MeineLocation", dataString);

            for (int i = 0; i < Game1.locations.Count; i++)
            {
                if (Game1.locations[i] != null && Game1.locations[i].name.Equals("YourLocationName"))
                {
                    Game1.locations.RemoveAt(i);
                }
            }
        }
        private GameLocationStruct saveDataPrepare(GameLocation gameLocation)
        {
            GameLocationStruct gameLocationStruct = new GameLocationStruct();

            gameLocationStruct.terrainFeatures      = new SerializableDictionary <Vector2, TerrainFeature>();
            gameLocationStruct.largeTerrainFeatures = new SerializableDictionary <Vector2, LargeTerrainFeature>();

            gameLocationStruct.name = gameLocation.name;

            String[] layersName = { "Back", "Buildings", "Paths", "Front", "AlwaysFront" };
            for (int i = 0; i < layersName.Length; i++)
            {
                Layer currentLayer = gameLocation.map.GetLayer(layersName[i]);
                if (currentLayer == null)
                {
                    continue;
                }

                gameLocationStruct.width  = currentLayer.LayerWidth < gameLocationStruct.width ? gameLocationStruct.width : currentLayer.LayerWidth;
                gameLocationStruct.height = currentLayer.LayerHeight < gameLocationStruct.height ? gameLocationStruct.height : currentLayer.LayerHeight;
                for (int x = 0; x < currentLayer.LayerWidth; x++)
                {
                    for (int y = 0; y < currentLayer.LayerHeight; y++)
                    {
                        if (currentLayer.Tiles[x, y] != null)
                        {
                            Tile currentTile = new Tile(Tile.TileLayerFormString(layersName[i]), x, y, currentLayer.Tiles[x, y].TileIndex, currentLayer.Tiles[x, y].TileSheet.Id);
                            gameLocationStruct.Tiles.Add(currentTile);


                            //das koennte eine Moeglichkeit sein, an die noetigen Daten ranzukommen: Aber welche Daten genau werden damit abgerufen??
                            //String string1 = currentLayer.Properties.ToList()[0].Key;


                            //das ist der Neue Teil
                            for (int j = 0; j < currentLayer.Tiles[x, y].Properties.ToList().Count; j++)
                            {
                                //this.Monitor.Log($"{currentLayer.Tiles[x,y].Properties.ToList()[j].Key}  - KEY : {currentLayer.Tiles[x, y].Properties.ToList()[j].Value}  VALUE", LogLevel.Warn);
                                currentTile.tileProperties.Add(new TilePropertie(currentLayer.ToString(), currentLayer.Tiles[x, y].Properties.ToList()[j].Key, currentLayer.Tiles[x, y].Properties.ToList()[j].Value));
                            }
                        }
                    }
                }
            }

            for (int i = 0; i < TerrainFeatureLocation.Count(); i++)
            {
                if (TerrainFeatureLocation.Keys != null && TerrainFeatureLocation.Keys.ToArray()[i].Equals(gameLocation.name))
                {
                    // TerrainFeatureLocation.Values.ToArray()[j].terrainFeature.Add(args.Added.ToArray()[0].Value);
                    for (int j = 0; j < TerrainFeatureLocation.Values.ToList()[i].terrainFeaturePairs.Count(); j++)
                    {
                        if (!gameLocationStruct.terrainFeatures.ContainsKey(TerrainFeatureLocation.Values.ToList()[i].terrainFeaturePairs[j].vector2))
                        {
                            gameLocationStruct.terrainFeatures.Add(TerrainFeatureLocation.Values.ToList()[i].terrainFeaturePairs[j].vector2, TerrainFeatureLocation.Values.ToList()[i].terrainFeaturePairs[j].terrainFeature);
                        }
                    }
                }
            }

            this.Monitor.Log($"{gameLocation.terrainFeatures.Keys.ToList().Count} ist die Anzahl der TerrainFeatures beim saven!!", LogLevel.Warn);

            for (int i = 0; i < gameLocation.terrainFeatures.Keys.ToList().Count; i++) //(SerializableDictionary<Vector2, TerrainFeature>.KeyCollection terrainFeature in gameLocation.terrainFeatures)
            {
                if (!gameLocationStruct.terrainFeatures.ContainsKey(gameLocation.terrainFeatures.Keys.ToList()[i]))
                {
                    gameLocationStruct.terrainFeatures.Add(gameLocation.terrainFeatures.Keys.ToList()[i], gameLocation.terrainFeatures.Values.ToList()[i]);
                }
            }


            for (int i = 0; i < LargeTerrainFeatureLocation.Count(); i++)
            {
                if (LargeTerrainFeatureLocation.Keys != null && LargeTerrainFeatureLocation.Keys.ToArray()[i].Equals(gameLocation.name))
                {
                    // TerrainFeatureLocation.Values.ToArray()[j].terrainFeature.Add(args.Added.ToArray()[0].Value);
                    for (int j = 0; j < LargeTerrainFeatureLocation.Values.ToList()[i].LargeterrainFeaturePairs.Count(); j++)
                    {
                        if (!gameLocationStruct.largeTerrainFeatures.ContainsKey(LargeTerrainFeatureLocation.Values.ToList()[i].LargeterrainFeaturePairs[j].vector2))
                        {
                            gameLocationStruct.largeTerrainFeatures.Add(LargeTerrainFeatureLocation.Values.ToList()[i].LargeterrainFeaturePairs[j].vector2, LargeTerrainFeatureLocation.Values.ToList()[i].LargeterrainFeaturePairs[j].largeterrainFeature);
                        }
                    }
                }
            }

            this.Monitor.Log($"{gameLocation.largeTerrainFeatures.ToList().Count} ist die Anzahl der LargeTerrainFeatures beim saven!!", LogLevel.Warn);

            for (int i = 0; i < gameLocation.largeTerrainFeatures.ToList().Count; i++) //(SerializableDictionary<Vector2, TerrainFeature>.KeyCollection terrainFeature in gameLocation.terrainFeatures)
            {
                //WTF?! My brain is f****d! LOL
                if (!gameLocationStruct.largeTerrainFeatures.ContainsKey(gameLocation.largeTerrainFeatures[i].currentTileLocation))
                {
                    gameLocationStruct.largeTerrainFeatures.Add(gameLocation.largeTerrainFeatures[i].currentTileLocation, gameLocation.largeTerrainFeatures[i]);
                }
            }


            return(gameLocationStruct);
        }
        private void load(GameLocation gameLocation, GameLocationStruct gameLocationStruct)
        {
            string tilesheetPath = this.Helper.Content.GetActualAssetKey("assets/spring_outdoorsTileSheet.png", ContentSource.ModFolder);
            //gameLocation.map = new Map();
            TileSheet tilesheet = new TileSheet(
                id: "z_your-custom-spritesheet",  // a unique ID for the tilesheet
                map: gameLocation.map,
                imageSource: tilesheetPath,
                sheetSize: new xTile.Dimensions.Size(25, 79), // the tile size of your tilesheet image.
                tileSize: new xTile.Dimensions.Size(16, 16)   // should always be 16x16 for maps
                );

            gameLocation.map.AddTileSheet(tilesheet);
            gameLocation.map.LoadTileSheets(Game1.mapDisplayDevice);

            for (int i = 0; i < gameLocationStruct.Tiles.Count; i++)
            {
                Tile   currentTile        = gameLocationStruct.Tiles[i];
                String currentLayerString = currentTile.LayerName;
                if (currentLayerString == null)
                {
                    continue;
                }
                Layer layer1 = gameLocation.map.GetLayer(currentLayerString);
                if (layer1 == null)
                {
                    continue;
                }

                layer1.Tiles[currentTile.X, currentTile.Y] = new StaticTile(layer1, tilesheet, BlendMode.Alpha, tileIndex: currentTile.TileID); // change tile index
            }

            if (gameLocationStruct.terrainFeatures != null)
            {
                this.Monitor.Log($"{gameLocationStruct.terrainFeatures.Keys.ToList().Count} ist die Anzahl der TerrainFeatures!!", LogLevel.Warn);
                foreach (KeyValuePair <Vector2, TerrainFeature> terrainFeature in gameLocationStruct.terrainFeatures)
                {
                    gameLocation.terrainFeatures.Add(terrainFeature.Key, terrainFeature.Value);



                    if (!TerrainFeatureLocation.ContainsKey(gameLocationStruct.name))
                    {
                        TerrainFeatureLocation.Add(gameLocationStruct.name, new TerrainFeaturePairList());
                    }
                    for (int j = 0; j < TerrainFeatureLocation.Count(); j++)
                    {
                        if (TerrainFeatureLocation.Keys != null && TerrainFeatureLocation.Keys.ToArray()[j].Equals(gameLocationStruct.name))
                        {
                            TerrainFeatureLocation.Values.ToArray()[j].terrainFeaturePairs.Add(new TerrainFeaturePair(terrainFeature.Key, terrainFeature.Value));
                        }
                    }
                }
            }

            if (gameLocationStruct.largeTerrainFeatures != null)
            {
                foreach (LargeTerrainFeature largeTerrainFeature in gameLocationStruct.largeTerrainFeatures.Values)
                {
                    largeTerrainFeature.currentLocation = gameLocation;
                }
                this.Monitor.Log($"{gameLocationStruct.largeTerrainFeatures.Keys.ToList().Count} ist die Anzahl der LargeTerrainFeatures!!", LogLevel.Warn);
                foreach (KeyValuePair <Vector2, LargeTerrainFeature> largeTerrainFeature in gameLocationStruct.largeTerrainFeatures)
                {
                    //gameLocation.largeTerrainFeatures.Add(largeTerrainFeature.Value); //TODO: ueberdenken?
                    try
                    {
                        gameLocation.largeTerrainFeatures.Add(new Bush(largeTerrainFeature.Value.tilePosition, ((Bush)largeTerrainFeature.Value).size, gameLocation));
                    }
                    catch (Exception e)
                    {
                        gameLocation.largeTerrainFeatures.Add(largeTerrainFeature.Value);
                    }

                    if (!LargeTerrainFeatureLocation.ContainsKey(gameLocationStruct.name))
                    {
                        LargeTerrainFeatureLocation.Add(gameLocationStruct.name, new LargeTerrainFeaturePairList());
                    }
                    for (int j = 0; j < LargeTerrainFeatureLocation.Count(); j++)
                    {
                        if (LargeTerrainFeatureLocation.Keys != null && LargeTerrainFeatureLocation.Keys.ToArray()[j].Equals(gameLocationStruct.name))
                        {
                            LargeTerrainFeatureLocation.Values.ToArray()[j].LargeterrainFeaturePairs.Add(new LargeTerrainFeaturePair(largeTerrainFeature.Key, largeTerrainFeature.Value));
                        }
                    }
                }
            }



            for (int i = 0; i < gameLocationStruct.Tiles.Count; i++)
            {
                for (int j = 0; j < gameLocationStruct.Tiles[i].tileProperties.Count; j++)
                {
                    gameLocation.setTileProperty(gameLocationStruct.Tiles[i].X, gameLocationStruct.Tiles[i].Y, gameLocationStruct.Tiles[i].tileProperties[j].layer, gameLocationStruct.Tiles[i].tileProperties[j].key, gameLocationStruct.Tiles[i].tileProperties[j].value);
                    //gameLocationStruct.Tiles[i].tileProperties
                }
            }
        }