public static MyCompositeShapeProvider CreateAsteroidShape(int seed, float size, int generatorEntry)
        {
            var result = new MyCompositeShapeProvider();

            result.m_state.Version = CURRENT_VERSION;
            if (generatorEntry < 0)
            {
                generatorEntry = 0;
            }
            result.m_state.Generator = generatorEntry;
            result.m_state.Seed      = seed;
            result.m_state.Size      = size;

            MyCompositeShapes.AsteroidGenerators[result.m_state.Generator](seed, size, out result.m_data);

            return(result);
        }
        // Do NOT use! Work in progress which is likely to change, breaking all saves that use this.
        public static MyCompositeShapeProvider CreatePlanetShape(int generatorEntry,
                                                                 ref MyCsgShapePlanetShapeAttributes shapeAttributes,
                                                                 float maxHillHeight,
                                                                 ref MyCsgShapePlanetMaterialAttributes materialAttributes)
        {
            var result = new MyCompositeShapeProvider();

            result.m_state.Version      = CURRENT_VERSION;
            result.m_state.Generator    = generatorEntry;
            result.m_state.Seed         = shapeAttributes.Seed;
            result.m_state.Size         = shapeAttributes.Diameter;
            result.m_state.IsPlanet     = 1;
            result.m_materialAttributes = materialAttributes;
            result.m_shapeAttributes    = shapeAttributes;
            result.m_maxHillHeight      = maxHillHeight;

            MyCompositeShapes.PlanetGenerators[result.m_state.Generator](ref shapeAttributes, maxHillHeight, ref materialAttributes, out result.m_data);

            return(result);
        }
        // Do NOT use! Work in progress which is likely to change, breaking all saves that use this.
        private static MyCompositeShapeProvider CreatePlanetShape(int generatorEntry,
                                                                  ref MyCsgShapePlanetShapeAttributes shapeAttributes,
                                                                  ref MyCsgShapePlanetHillAttributes hillAttributes,
                                                                  ref MyCsgShapePlanetHillAttributes canyonAttributes,
                                                                  MyMaterialLayer[] materialLevels)
        {
            var result = new MyCompositeShapeProvider();

            result.m_state.Version    = CURRENT_VERSION;
            result.m_state.Generator  = generatorEntry;
            result.m_state.Seed       = shapeAttributes.Seed;
            result.m_state.Size       = shapeAttributes.Radius;
            result.m_state.IsPlanet   = 1;
            result.m_materialLayers   = materialLevels;
            result.m_shapeAttributes  = shapeAttributes;
            result.m_hillAttributes   = hillAttributes;
            result.m_canyonAttributes = canyonAttributes;

            MyCompositeShapes.PlanetGenerators[result.m_state.Generator](ref shapeAttributes, ref hillAttributes, ref canyonAttributes, materialLevels, out result.m_data);

            return(result);
        }
        public static MyCompositeShapeProvider CreateAsteroidShape(int seed, float size, int generatorEntry)
        {
            var result = new MyCompositeShapeProvider();
            result.m_state.Version = CURRENT_VERSION;
            if (generatorEntry > MyCompositeShapes.AsteroidGenerators.Length - 1)
                generatorEntry = MyCompositeShapes.AsteroidGenerators.Length - 1;
            else if (generatorEntry <0)
                generatorEntry = 0;
            result.m_state.Generator = generatorEntry;
            result.m_state.Seed = seed;
            result.m_state.Size = size;
            result.m_state.IsPlanet = 0;

            MyCompositeShapes.AsteroidGenerators[result.m_state.Generator](seed, size, out result.m_data);

            return result;
        }
        // Do NOT use! Work in progress which is likely to change, breaking all saves that use this.
        private static MyCompositeShapeProvider CreatePlanetShape(int generatorEntry,
            ref MyCsgShapePlanetShapeAttributes shapeAttributes,
            ref MyCsgShapePlanetHillAttributes hillAttributes,
            ref MyCsgShapePlanetHillAttributes canyonAttributes,
            MyMaterialLayer[] materialLevels)
        {
            var result = new MyCompositeShapeProvider();
            result.m_state.Version = CURRENT_VERSION;
            result.m_state.Generator = generatorEntry;
            result.m_state.Seed = shapeAttributes.Seed;
            result.m_state.Size = shapeAttributes.Radius;
            result.m_state.IsPlanet = 1;
            result.m_materialLayers = materialLevels;
            result.m_shapeAttributes = shapeAttributes;
            result.m_hillAttributes = hillAttributes;
            result.m_canyonAttributes = canyonAttributes;

            MyCompositeShapes.PlanetGenerators[result.m_state.Generator](ref shapeAttributes, ref hillAttributes, ref canyonAttributes, materialLevels, out result.m_data);

            return result;
        }
        public override void GenerateObjects(List <MyObjectSeed> objectsList)
        {
            ProfilerShort.Begin("GenerateObjects");
            foreach (var objectSeed in objectsList)
            {
                if (objectSeed.Generated)
                {
                    continue;
                }

                objectSeed.Generated = true;

                using (MyRandom.Instance.PushSeed(GetObjectIdSeed(objectSeed)))
                {
                    switch (objectSeed.Type)
                    {
                    case MyObjectSeedType.Asteroid:
                        ProfilerShort.Begin("Asteroid");

                        var bbox = objectSeed.BoundingVolume;
                        MyGamePruningStructure.GetAllVoxelMapsInBox(ref bbox, m_tmpVoxelMapsList);

                        String storageName = string.Format("Asteroid_{0}_{1}_{2}_{3}_{4}", objectSeed.CellId.X, objectSeed.CellId.Y, objectSeed.CellId.Z, objectSeed.Index, objectSeed.Seed);

                        bool exists = false;
                        foreach (var voxelMap in m_tmpVoxelMapsList)
                        {
                            if (voxelMap.StorageName == storageName)
                            {
                                exists = true;
                                break;
                            }
                        }

                        if (!exists)
                        {
                            var           provider = MyCompositeShapeProvider.CreateAsteroidShape(objectSeed.Seed, objectSeed.Size, MySession.Static.Settings.VoxelGeneratorVersion);
                            MyStorageBase storage  = new MyOctreeStorage(provider, GetAsteroidVoxelSize(objectSeed.Size));
                            var           voxelMap = MyWorldGenerator.AddVoxelMap(storageName, storage, objectSeed.BoundingVolume.Center - VRageMath.MathHelper.GetNearestBiggerPowerOfTwo(objectSeed.Size) / 2, GetAsteroidEntityId(objectSeed));

                            if (voxelMap != null)
                            {
                                voxelMap.Save = false;
                                RangeChangedDelegate OnStorageRangeChanged = null;
                                OnStorageRangeChanged = delegate(Vector3I minVoxelChanged, Vector3I maxVoxelChanged, MyStorageDataTypeFlags changedData)
                                {
                                    voxelMap.Save         = true;
                                    storage.RangeChanged -= OnStorageRangeChanged;
                                };
                                storage.RangeChanged += OnStorageRangeChanged;
                            }
                        }
                        m_tmpVoxelMapsList.Clear();
                        ProfilerShort.End();
                        break;

                    case MyObjectSeedType.EncounterAlone:
                    case MyObjectSeedType.EncounterSingle:
                    case MyObjectSeedType.EncounterMulti:
                        ProfilerShort.Begin("Encounter");
                        MyEncounterGenerator.PlaceEncounterToWorld(objectSeed.BoundingVolume, objectSeed.Seed, objectSeed.Type);
                        ProfilerShort.End();
                        break;

                    default:
                        throw new InvalidBranchException();
                        break;
                    }
                }
            }
            ProfilerShort.End();
        }
        public static bool PlaceEncounterToWorld(BoundingBoxD boundingVolume, int seed, MyObjectSeedType seedType)
        {
            if (MySession.Static.Settings.EnableEncounters == false)
            {
                return(false);
            }

            boundingVolume.Max.X = Math.Round(boundingVolume.Max.X, 2);
            boundingVolume.Max.Y = Math.Round(boundingVolume.Max.Y, 2);
            boundingVolume.Max.Z = Math.Round(boundingVolume.Max.Z, 2);

            boundingVolume.Min.X = Math.Round(boundingVolume.Min.X, 2);
            boundingVolume.Min.Y = Math.Round(boundingVolume.Min.Y, 2);
            boundingVolume.Min.Z = Math.Round(boundingVolume.Min.Z, 2);

            Vector3D placePosition = boundingVolume.Center;

            m_random.SetSeed(seed);

            if (m_spawnGroups.Count == 0)
            {
                m_spawnGroupsNoVoxels.Clear();
                var allSpawnGroups = MyDefinitionManager.Static.GetSpawnGroupDefinitions();
                foreach (var spawnGroup in allSpawnGroups)
                {
                    if (spawnGroup.IsEncounter)
                    {
                        m_spawnGroups.Add(spawnGroup);
                        if (spawnGroup.Voxels.Count == 0)
                        {
                            m_spawnGroupsNoVoxels.Add(spawnGroup);
                        }
                    }
                }
            }

            if (m_spawnGroups.Count > 0)
            {
                m_randomEncounters.Clear();
                m_placePositions.Clear();
                m_encountersId.Clear();
                int numEncoutersToPlace = seedType == MyObjectSeedType.EncounterMulti ? 2 : 1;
                List <MySpawnGroupDefinition> currentSpawnGroup = seedType == MyObjectSeedType.EncounterMulti ? m_spawnGroupsNoVoxels : m_spawnGroups;

                for (int i = 0; i < numEncoutersToPlace; ++i)
                {
                    MyEncounterId encounterPosition = new MyEncounterId(boundingVolume, seed, i);
                    if (true == m_savedEncounters.Contains(encounterPosition))
                    {
                        continue;
                    }
                    m_randomEncounters.Add(PickRandomEncounter(currentSpawnGroup));
                    Vector3D newPosition   = placePosition + (i == 0 ? -1 : 1) * GetEncounterBoundingBox(currentSpawnGroup[m_randomEncounters[m_randomEncounters.Count - 1]]).HalfExtents;
                    Vector3D savedPosition = Vector3D.Zero;
                    if (true == m_movedOnlyEncounters.Dictionary.TryGetValue(encounterPosition, out savedPosition))
                    {
                        newPosition = savedPosition;
                    }
                    encounterPosition.PlacePosition = newPosition;

                    m_encountersId.Add(encounterPosition);

                    m_placePositions.Add(newPosition);
                }

                //first place voxels becaose voxel needs to be created even on client and if grids were created first
                //entity ids woudn't match
                for (int i = 0; i < m_randomEncounters.Count; ++i)
                {
                    foreach (var selectedVoxel in currentSpawnGroup[m_randomEncounters[i]].Voxels)
                    {
                        var filePath = MyWorldGenerator.GetVoxelPrefabPath(selectedVoxel.StorageName);

                        var storage = MyStorageBase.LoadFromFile(filePath);
                        storage.DataProvider = MyCompositeShapeProvider.CreateAsteroidShape(0, 1.0f, MySession.Static.Settings.VoxelGeneratorVersion);
                        IMyEntity voxel = MyWorldGenerator.AddVoxelMap(String.Format("Asteroid_{0}_{1}_{2}", m_entityToEncounterConversion.Count, seed, m_random.Next()), storage, m_placePositions[i] + selectedVoxel.Offset);
                        voxel.Save              = false;
                        voxel.OnPhysicsChanged += OnCreatedEntityChanged;
                        m_entityToEncounterConversion[voxel] = m_encountersId[i];
                    }
                }

                if (Sync.IsServer == true)
                {
                    for (int i = 0; i < m_randomEncounters.Count; ++i)
                    {
                        SpawnEncouter(m_encountersId[i], m_placePositions[i], currentSpawnGroup, m_randomEncounters[i]);
                    }
                }
            }

            return(true);
        }
Exemplo n.º 8
0
        public override void GenerateObjects(List <MyObjectSeed> objectsList, HashSet <MyObjectSeedParams> existingObjectsSeeds)
        {
            ProfilerShort.Begin("GenerateObjects");
            foreach (var objectSeed in objectsList)
            {
                if (objectSeed.Params.Generated || existingObjectsSeeds.Contains(objectSeed.Params))
                {
                    continue;
                }

                objectSeed.Params.Generated = true;

                using (MyRandom.Instance.PushSeed(GetObjectIdSeed(objectSeed)))
                {
                    switch (objectSeed.Params.Type)
                    {
                    case MyObjectSeedType.Asteroid:
                        ProfilerShort.Begin("Asteroid");

                        var bbox = objectSeed.BoundingVolume;
                        MyGamePruningStructure.GetAllVoxelMapsInBox(ref bbox, m_tmpVoxelMapsList);

                        String storageName = string.Format("Asteroid_{0}_{1}_{2}_{3}_{4}", objectSeed.CellId.X, objectSeed.CellId.Y, objectSeed.CellId.Z, objectSeed.Params.Index, objectSeed.Params.Seed);

                        bool exists = false;
                        foreach (var voxelMap in m_tmpVoxelMapsList)
                        {
                            if (voxelMap.StorageName == storageName)
                            {
                                existingObjectsSeeds.Add(objectSeed.Params);
                                exists = true;
                                break;
                            }
                        }

                        if (!exists)
                        {
                            var           provider = MyCompositeShapeProvider.CreateAsteroidShape(objectSeed.Params.Seed, objectSeed.Size, MySession.Static.Settings.VoxelGeneratorVersion);
                            MyStorageBase storage  = new MyOctreeStorage(provider, GetAsteroidVoxelSize(objectSeed.Size));
                            var           voxelMap = MyWorldGenerator.AddVoxelMap(storageName, storage, objectSeed.BoundingVolume.Center - VRageMath.MathHelper.GetNearestBiggerPowerOfTwo(objectSeed.Size) / 2, GetAsteroidEntityId(storageName));

                            if (voxelMap != null)
                            {
                                voxelMap.Save = false;
                                MyVoxelBase.StorageChanged OnStorageRangeChanged = null;
                                OnStorageRangeChanged = delegate(MyVoxelBase voxel, Vector3I minVoxelChanged, Vector3I maxVoxelChanged, MyStorageDataTypeFlags changedData)
                                {
                                    voxelMap.Save          = true;
                                    voxelMap.RangeChanged -= OnStorageRangeChanged;
                                };
                                voxelMap.RangeChanged += OnStorageRangeChanged;
                            }
                        }
                        m_tmpVoxelMapsList.Clear();
                        ProfilerShort.End();
                        break;

                    case MyObjectSeedType.EncounterAlone:
                    case MyObjectSeedType.EncounterSingle:
                    case MyObjectSeedType.EncounterMulti:
                        ProfilerShort.Begin("Encounter");
                        bool doSpawn = true;
                        foreach (var start in MySession.Static.Scenario.PossiblePlayerStarts)
                        {
                            Vector3D?startPos = start.GetStartingLocation();
                            if (!startPos.HasValue)
                            {
                                startPos = Vector3D.Zero;
                            }
                            if ((startPos.Value - objectSeed.BoundingVolume.Center).LengthSquared() < (15000 * 15000))
                            {
                                doSpawn = false;
                            }
                        }
                        if (doSpawn)
                        {
                            MyEncounterGenerator.PlaceEncounterToWorld(objectSeed.BoundingVolume, objectSeed.Params.Seed, objectSeed.Params.Type);
                        }
                        ProfilerShort.End();
                        break;

                    default:
                        throw new InvalidBranchException();
                        break;
                    }
                }
            }
            ProfilerShort.End();
        }
        // Do NOT use! Work in progress which is likely to change, breaking all saves that use this.
        public static MyCompositeShapeProvider CreatePlanetShape(int generatorEntry,
            ref MyCsgShapePlanetShapeAttributes shapeAttributes,
            float maxHillHeight,
            ref MyCsgShapePlanetMaterialAttributes materialAttributes)
        {
            var result = new MyCompositeShapeProvider();
            result.m_state.Version = CURRENT_VERSION;
            result.m_state.Generator = generatorEntry;
            result.m_state.Seed = shapeAttributes.Seed;
            result.m_state.Size = shapeAttributes.Diameter;
            result.m_state.IsPlanet = 1;
            result.m_materialAttributes = materialAttributes;
            result.m_shapeAttributes = shapeAttributes;
            result.m_maxHillHeight = maxHillHeight;

            MyCompositeShapes.PlanetGenerators[result.m_state.Generator](ref shapeAttributes, maxHillHeight, ref materialAttributes, out result.m_data);

            return result;
        }