// return true if success, false if failure public bool Snap() { var cellsToTake = GetCellsToTake(); if (CanSnap(cellsToTake)) { var parents = new List <ModBrickInstance>(); foreach (var c in cellsToTake) { parents.Add(c.CellGrid.ModBrickInstance); c.CellGrid.TakeSpace(c.GridPos); } parents = parents.Distinct().ToList(); foreach (var p in parents) { p.AddChild(_modBrickInstance); } _visual.Hide(); _visual.transform.SetParent(null); transform.position = _visual.transform.position; transform.position = ModBrickMetrics.RoundToGrid(transform.position); transform.SetParent(parents.FirstOrDefault().transform); _modBrickInstance.SetParents(parents); _snapped = true; return(true); } return(false); }
private Vector3 ChooseBestSnappingPositionNew() { var highestCellY = _potentialGridCellsWorld.Max(x => x.WorldPos.y); var highestCells = _potentialGridCellsWorld.Where(x => x.WorldPos.y == highestCellY).ToList(); var total = Vector3.zero; foreach (var p in highestCells) { total += p.WorldPos; } var avgPosition = total / highestCells.Count; var avgZIndex = (float)highestCells.Select(x => ModBrickMetrics.TubeLocalToGridPos(x.TubeLocalPos.z)).Average(); var avgXIndex = (float)highestCells.Select(x => ModBrickMetrics.TubeLocalToGridPos(x.TubeLocalPos.x)).Average(); avgPosition.x = avgPosition.x - avgXIndex * ModBrickMetrics.Unit - ModBrickMetrics.Unit / 2; avgPosition.y = avgPosition.y - ModBrickMetrics.ThirdHeight / 2; avgPosition.z = avgPosition.z - avgZIndex * ModBrickMetrics.Unit - ModBrickMetrics.Unit / 2; return(avgPosition); }