public async void SetupTileMap(GameState gameState)
        {
            gameState.hasTileMapSetupBegun = true;
            pathfindingTileMap             = GetNode <PathfindingTileMap>(pathfindingTileMapNodePath);
            tileMapObjectContainer         = GetNode <Node2D>(tileMapObjectContainerNodePath);
            SetupTileMapObjectNodeReferences();
            SetupTileChildren();
            var task = Task.Run(AddTileMapObjects);

            pathfindingTileMap.UpdateAStarGrid();
            await task;

            tileMapObjectContainer.AddChild(task.Result);
            gameState.isTileMapSetup = true;
            Logger.Debug("Setup of tileMap finished!");
        }
        public void SetTree(Vector2 treeWorldPosition)
        {
            var tileMapPosition = pathfindingTileMap.WorldToMap(treeWorldPosition);
            var uniqueCellId    = pathfindingTileMap.GetIdForTile(tileMapPosition);

            pathfindingTileMap.SetCell((int)tileMapPosition.x, (int)tileMapPosition.y, pathfindingTileMap.treeId);

            if (tileMapObjects.TryGetValue(uniqueCellId, out var objectNodeReference))
            {
//                objectNodeReference.parents.Clear();
                objectNodeReference.node?.QueueFree();

                if (tileIdToPackedSceneMapping.TryGetValue(pathfindingTileMap.treeId, out var treePackedScene))
                {
                    objectNodeReference.node = treePackedScene.Instance() as Node2D;
                    tileMapObjectContainer.AddChild(objectNodeReference.node);
                    if (objectNodeReference.node != null)
                    {
                        objectNodeReference.node.ZIndex = (int)tileMapPosition.y * 2;
                        objectNodeReference.node?.SetGlobalPosition(pathfindingTileMap.MapToWorld(tileMapPosition) + pathfindingTileMap.CellSize / 2);
                    }
                }
                else
                {
                    throw new Exception("PackedScene cannot be null!");
                }

                var overlappingTiles = GetOverlappingTiles(tileMapPosition);

                foreach (var overlappingTile in overlappingTiles)
                {
                    var uniqueTileId = pathfindingTileMap.GetIdForTile(overlappingTile);

                    if (tileMapObjects.TryGetValue(uniqueTileId, out var tileMapObjectNodeReference))
                    {
                        if (pathfindingTileMap.GetCell((int)overlappingTile.x, (int)overlappingTile.y) == pathfindingTileMap.traversableId)
                        {
                            tileMapObjectNodeReference.node?.QueueFree();
                            pathfindingTileMap.SetCell((int)overlappingTile.x, (int)overlappingTile.y, pathfindingTileMap.playerTraversableId);

                            if (tileIdToPackedSceneMapping.TryGetValue(pathfindingTileMap.playerTraversableId, out var packedScene))
                            {
                                tileMapObjectNodeReference.node = packedScene.Instance() as Node2D;
                                tileMapObjectContainer.AddChild(tileMapObjectNodeReference.node);
                                if (objectNodeReference.node != null)
                                {
                                    objectNodeReference.node.ZIndex = (int)tileMapPosition.y * 2;
                                    tileMapObjectNodeReference.node?.SetGlobalPosition(pathfindingTileMap.MapToWorld(overlappingTile) + pathfindingTileMap.CellSize / 2);
                                }
                            }
                            else
                            {
                                throw new Exception("PackedScene cannot be null!");
                            }
                        }

                        tileMapObjectNodeReference.parents.Add(uniqueCellId);
                    }
                    else
                    {
                        throw new Exception("Expected already setup tileMapObjectNodeReference!");
                    }
                }
            }
            else
            {
                throw new Exception("Expected already setup tileMapObjectNodeReference!");
            }

            pathfindingTileMap.UpdateAStarGrid();
        }