예제 #1
0
 private void ComputeReservedSpace(MyObjectBuilder_CubeGrid primaryGrid, IEnumerable <MyObjectBuilder_CubeGrid> allGrids, BlockSetInfo info)
 {
     m_reservedSpaces.Clear();
     ReservedSpace = new BoundingBox();
     foreach (var block in primaryGrid.CubeBlocks)
     {
         foreach (var name in block.ConfigNames())
         {
             if (!name.StartsWithICase(ReservedSpacePrefix))
             {
                 continue;
             }
             var args = name.Substring(ReservedSpacePrefix.Length).Trim().Split(' ').Select(x => x.Trim()).Where(x => x.Length > 0).ToArray();
             var box  = PartDummyUtils.ParseReservedSpace(MyDefinitionManager.Static.GetCubeSize(primaryGrid.GridSizeEnum), block, args,
                                                          Logger.Warning);
             box.Box.Max += (Vector3I)block.Min;
             box.Box.Min += (Vector3I)block.Min;
             if (m_reservedSpaces.Count == 0)
             {
                 ReservedSpace = new BoundingBox(box.Box.Min, box.Box.Max);
             }
             ReservedSpace = ReservedSpace.Include(box.Box.Min);
             ReservedSpace = ReservedSpace.Include(box.Box.Max);
             m_reservedSpaces.Add(box);
         }
     }
 }
예제 #2
0
        public virtual void Init(Ob_Part v)
        {
            BlockSetInfo.BlockCountByType.Clear();
            foreach (var kv in v.BlockCountByType)
            {
                BlockSetInfo.BlockCountByType[kv.Item1] = kv.Item2;
            }

            BlockSetInfo.ComponentCost.Clear();
            foreach (var kv in v.ComponentCost)
            {
                BlockSetInfo.ComponentCost[MyDefinitionManager.Static.GetComponentDefinition(kv.Item1)] = kv.Item2;
            }

            m_blocks.Clear();
            foreach (var kv in v.OccupiedLocations)
            {
                m_blocks[kv] = null;
            }

            BlockSetInfo.PowerConsumptionByGroup.Clear();
            foreach (var kv in v.PowerConsumptionByGroup)
            {
                BlockSetInfo.PowerConsumptionByGroup[kv.Item1] = kv.Item2;
            }

            m_reservedSpaces.Clear();
            m_reservedSpaces.AddRange(v.ReservedSpaces.Select(x => new ReservedSpace(x)));

            m_mountPoints.Clear();
            m_mountPointBlocks.Clear();
            foreach (var mp in v.MountPoints)
            {
                var block = new PartMount(this, mp.Type, mp.Name);
                block.Init(mp);

                Dictionary <string, PartMount> partsOfType;
                if (!m_mountPoints.TryGetValue(mp.Type, out partsOfType))
                {
                    partsOfType = m_mountPoints[mp.Type] = new Dictionary <string, PartMount>();
                }

                partsOfType[mp.Name] = block;
                foreach (var kv in block.Blocks)
                {
                    m_mountPointBlocks[kv.AnchorLocation] = kv;
                }
            }

            // Load AABBs
            BoundingBox = BoundingBox.CreateInvalid();
            foreach (var p in v.OccupiedLocations)
            {
                BoundingBox = BoundingBox.Include((Vector3I)p);
            }
            ReservedSpace = BoundingBox.CreateInvalid();
            foreach (var r in v.ReservedSpaces)
            {
                ReservedSpace = ReservedSpace.Include(r.Min);
                ReservedSpace = ReservedSpace.Include(r.Max);
            }

            BlockSetInfo.UpdateCache();

            Logger.Info("Loaded {0} lazily with {1} mount points, {2} reserved spaces, and {3} occupied cubes.", Name, MountPoints.Count(), m_reservedSpaces.Count, m_blocks.Count);
            foreach (var type in MountPointTypes)
            {
                Logger.Info("    ...of type \"{0}\" there are {1}", type, MountPointsOfType(type).Count());
            }
        }
 public bool IsReserved(Vector3 pos, bool testShared, bool testOptional)
 {
     using (LockSharedUsing())
         return(ReservedSpace.Contains(pos) != ContainmentType.Disjoint && m_reservedSpaces.Any(x =>
                                                                                                (!x.IsShared || testShared) && (!x.IsOptional || testOptional) && x.Box.Contains(pos) != ContainmentType.Disjoint));
 }