Пример #1
0
        // 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);
        }
Пример #2
0
        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);
        }