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(); }