예제 #1
0
        public override void Init(MyObjectBuilder_EntityBase builder)
        {
            ProfilerShort.Begin("base init");

            SyncFlag = true;

            base.Init(builder);
            base.Init(null, null, null, null, null);

            ProfilerShort.BeginNextBlock("Load file");

            var ob = (MyObjectBuilder_VoxelMap)builder;

            if (ob == null)
            {
                return;
            }
            if (ob.MutableStorage)
            {
                StorageName = ob.StorageName;
            }
            else
            {
                StorageName = string.Format("{0}-{1}", ob.StorageName, m_immutableStorageNameSalt++);
            }

            m_storage = MyStorageBase.Load(ob.StorageName);
            m_storage.RangeChanged += storage_RangeChanged;
            m_storageMax            = m_storage.Size;

            InitVoxelMap(ob.PositionAndOrientation.Value.Position, m_storage.Size);

            ProfilerShort.End();
        }
예제 #2
0
        public override void Init(MyObjectBuilder_EntityBase builder)
        {
            var ob = (MyObjectBuilder_VoxelMap)builder;

            if (ob == null)
            {
                return;
            }

            m_storage = MyStorageBase.Load(ob.StorageName);

            //By Gregory: Added for compatibility with old saves
            if (m_storage == null)
            {
                return;
            }

            Init(builder, m_storage);

            if (ob.ContentChanged.HasValue)
            {
                ContentChanged = ob.ContentChanged.Value;
            }
            else
            {
                ContentChanged = true;
            }
        }
예제 #3
0
        public override void Init(MyObjectBuilder_EntityBase builder)
        {
            var ob = (MyObjectBuilder_VoxelMap)builder;

            if (ob == null)
            {
                return;
            }

            m_storage = MyStorageBase.Load(ob.StorageName);

            if (m_storage == null)
            {
                throw new Exception("Voxel storage not found: " + ob.StorageName);
            }

            Init(builder, m_storage);

            if (ob.ContentChanged.HasValue)
            {
                ContentChanged = ob.ContentChanged.Value;
            }
            else
            {
                ContentChanged = true;
            }
        }
예제 #4
0
        public override void Init(MyObjectBuilder_EntityBase builder)
        {
            if (MyFakes.ENABLE_PLANETS == false)
            {
                throw new PlanetsNotEnabledException();
            }

            ProfilerShort.Begin("base init");

            SyncFlag = true;

            base.Init(builder);
            base.Init(null, null, null, null, null);

            ProfilerShort.BeginNextBlock("Load file");

            var ob = (MyObjectBuilder_Planet)builder;

            if (ob == null)
            {
                return;
            }

            if (ob.MutableStorage)
            {
                StorageName = ob.StorageName;
            }
            else
            {
                StorageName = string.Format("{0}", ob.StorageName);
            }

            m_savedEnviromentSectors = ob.SavedEnviromentSectors;

            m_planetInitValues.StorageName           = StorageName;
            m_planetInitValues.Storage               = MyStorageBase.Load(ob.StorageName);
            m_planetInitValues.PositionMinCorner     = ob.PositionAndOrientation.Value.Position;
            m_planetInitValues.AveragePlanetRadius   = ob.Radius;
            m_planetInitValues.AtmosphereRadius      = ob.AtmosphereRadius;
            m_planetInitValues.MaximumHillRadius     = ob.MaximumHillRadius;
            m_planetInitValues.MinimumSurfaceRadius  = ob.MinimumSurfaceRadius;
            m_planetInitValues.HasAtmosphere         = ob.HasAtmosphere;
            m_planetInitValues.AtmosphereWavelengths = ob.AtmosphereWavelengths;
            m_planetInitValues.MaxOxygen             = ob.MaximumOxygen;
            m_planetInitValues.GravityFalloff        = ob.GravityFalloff;
            m_planetInitValues.MarkAreaEmpty         = ob.MarkAreaEmpty;

            Init(m_planetInitValues);

            ProfilerShort.End();
        }
예제 #5
0
        protected override void OnLoad(BitStream stream, Action <MyVoxelBase> loadingDoneHandler)
        {
            MyVoxelBase map = null;

            bool isFromPrefab = VRage.Serialization.MySerializer.CreateAndRead <bool>(stream);
            bool rangeChanged = VRage.Serialization.MySerializer.CreateAndRead <bool>(stream);

            byte[] data = null;
            if (rangeChanged)
            {
                data = VRage.Serialization.MySerializer.CreateAndRead <byte[]>(stream);
            }

            if (isFromPrefab)
            {
                var builder  = VRage.Serialization.MySerializer.CreateAndRead <MyObjectBuilder_EntityBase>(stream, MyObjectBuilderSerializer.Dynamic);
                var voxelMap = new MyVoxelMap();

                if (rangeChanged && data != null)
                {
                    IMyStorage storage = MyStorageBase.Load(data);
                    MyEntity   entity;
                    if (MyEntities.TryGetEntityById(builder.EntityId, out entity) && entity is MyVoxelMap)
                    {
                        voxelMap         = (entity as MyVoxelMap);
                        voxelMap.Storage = storage;
                    }
                    else
                    {
                        voxelMap.Init(builder, storage);
                        MyEntities.Add(voxelMap);
                    }
                }
                else
                {
                    voxelMap.Init(builder);
                    MyEntities.Add(voxelMap);
                }
                map = voxelMap;
            }
            else
            {
                long voxelMapId = VRage.Serialization.MySerializer.CreateAndRead <long>(stream);

                MyEntity entity = null;
                MyEntities.TryGetEntityById(voxelMapId, out entity);

                map = entity as MyVoxelBase;
            }
            loadingDoneHandler(map);
        }
예제 #6
0
        public override void Init(MyObjectBuilder_EntityBase builder)
        {
            var ob = (MyObjectBuilder_VoxelMap)builder;

            if (ob == null)
            {
                return;
            }

            m_storage = MyStorageBase.Load(ob.StorageName);
            Init(builder, m_storage);

            if (ob.ContentChanged.HasValue)
            {
                ContentChanged = ob.ContentChanged.Value;
            }
            else
            {
                ob.ContentChanged = true;
            }
        }
예제 #7
0
        public override void Init(MyObjectBuilder_EntityBase builder, Sandbox.Engine.Voxels.IMyStorage storage)
        {
            ProfilerShort.Begin("MyPlanet::Init()");
            if (MyFakes.ENABLE_PLANETS == false)
            {
                throw new PlanetsNotEnabledException();
            }

            ProfilerShort.Begin("MyVoxelBase Init");

            SyncFlag = true;

            base.Init(builder);

            ProfilerShort.BeginNextBlock("Load Saved Data");

            var ob = (MyObjectBuilder_Planet)builder;

            if (ob == null)
            {
                return;
            }

            MyLog.Default.WriteLine("Planet init info - MutableStorage:" + ob.MutableStorage + " StorageName:" + ob.StorageName + " storage?:" + (storage != null).ToString());

            if (ob.MutableStorage)
            {
                StorageName = ob.StorageName;
            }
            else
            {
                StorageName = string.Format("{0}", ob.StorageName);
            }

            m_planetInitValues.StorageName           = StorageName;
            m_planetInitValues.PositionMinCorner     = ob.PositionAndOrientation.Value.Position;
            m_planetInitValues.HasAtmosphere         = ob.HasAtmosphere;
            m_planetInitValues.AtmosphereRadius      = ob.AtmosphereRadius;
            m_planetInitValues.AtmosphereWavelengths = ob.AtmosphereWavelengths;
            m_planetInitValues.GravityFalloff        = ob.GravityFalloff;
            m_planetInitValues.MarkAreaEmpty         = ob.MarkAreaEmpty;
            m_planetInitValues.SurfaceGravity        = ob.SurfaceGravity;
            m_planetInitValues.AddGps = ob.ShowGPS;
            m_planetInitValues.SpherizeWithDistance = ob.SpherizeWithDistance;
            m_planetInitValues.Generator            = ob.PlanetGenerator == ""
                ? null
                : MyDefinitionManager.Static.GetDefinition <MyPlanetGeneratorDefinition>(
                MyStringHash.GetOrCompute(ob.PlanetGenerator));
            if (m_planetInitValues.Generator == null)
            {
                string message = string.Format("No definition found for planet generator {0}.", ob.PlanetGenerator);
                MyLog.Default.WriteLine(message);
                throw new MyIncompatibleDataException(message);
            }

            m_planetInitValues.AtmosphereSettings = m_planetInitValues.Generator.AtmosphereSettings.HasValue
                ? m_planetInitValues.Generator.AtmosphereSettings.Value
                : MyAtmosphereSettings.Defaults();
            m_planetInitValues.UserCreated = false;

            ProfilerShort.BeginNextBlock("Load Storage");
            if (storage != null)
            {
                m_planetInitValues.Storage = storage;
            }
            else
            {
                m_planetInitValues.Storage = MyStorageBase.Load(ob.StorageName);

                if (m_planetInitValues.Storage == null)
                {
                    string message = string.Format("No storage loaded for planet {0}.", ob.StorageName);
                    MyLog.Default.WriteLine(message);
                    throw new MyIncompatibleDataException(message);
                }
            }

            m_planetInitValues.InitializeComponents = false;

            ProfilerShort.BeginNextBlock("Init Internal");

            // MZ: if any crashes are related to MP planet init in the future, i added logging of MyPlanetInitArguments and other sanity checks.
            //     we are currently having crashes without this additional info and it is likely that even after my hotfixes it is going to crash again
            //     ...but we can check the logs and know the setup of the player :)
            MyLog.Default.Log(MyLogSeverity.Info, "Planet generator name: {0}", ob.PlanetGenerator ?? "<null>");

            // Initialize!
            Init(m_planetInitValues);

            ProfilerShort.End();

            ProfilerShort.End();
        }
예제 #8
0
        public override void Init(MyObjectBuilder_EntityBase builder, Sandbox.Engine.Voxels.IMyStorage storage)
        {
            ProfilerShort.Begin("MyPlanet::Init()");
            if (MyFakes.ENABLE_PLANETS == false)
            {
                throw new PlanetsNotEnabledException();
            }

            ProfilerShort.Begin("MyVoxelBase Init");

            SyncFlag = true;

            base.Init(builder);

            ProfilerShort.BeginNextBlock("Load Saved Data");

            var ob = (MyObjectBuilder_Planet)builder;

            if (ob == null)
            {
                return;
            }

            if (ob.MutableStorage)
            {
                StorageName = ob.StorageName;
            }
            else
            {
                StorageName = string.Format("{0}", ob.StorageName);
            }

            m_planetInitValues.StorageName           = StorageName;
            m_planetInitValues.PositionMinCorner     = ob.PositionAndOrientation.Value.Position;
            m_planetInitValues.HasAtmosphere         = ob.HasAtmosphere;
            m_planetInitValues.AtmosphereRadius      = ob.AtmosphereRadius;
            m_planetInitValues.AtmosphereWavelengths = ob.AtmosphereWavelengths;
            m_planetInitValues.GravityFalloff        = ob.GravityFalloff;
            m_planetInitValues.MarkAreaEmpty         = ob.MarkAreaEmpty;
            m_planetInitValues.SurfaceGravity        = ob.SurfaceGravity;
            m_planetInitValues.AddGps = ob.ShowGPS;
            m_planetInitValues.SpherizeWithDistance = ob.SpherizeWithDistance;
            m_planetInitValues.Generator            = ob.PlanetGenerator == "" ? null : MyDefinitionManager.Static.GetDefinition <MyPlanetGeneratorDefinition>(MyStringHash.GetOrCompute(ob.PlanetGenerator));
            if (m_planetInitValues.Generator == null)
            {
                string message = string.Format("No definition found for planet generator {0}.", ob.PlanetGenerator);
                MyLog.Default.WriteLine(message);
                throw new Exception(message);
            }

            m_planetInitValues.AtmosphereSettings = m_planetInitValues.Generator.AtmosphereSettings.HasValue ? m_planetInitValues.Generator.AtmosphereSettings.Value : MyAtmosphereSettings.Defaults();
            m_planetInitValues.UserCreated        = false;

            ProfilerShort.BeginNextBlock("Load Storage");
            if (storage != null)
            {
                m_planetInitValues.Storage = storage;
            }
            else
            {
                m_planetInitValues.Storage = MyStorageBase.Load(ob.StorageName);
            }

            ProfilerShort.BeginNextBlock("Init Internal");
            Init(m_planetInitValues);
            ProfilerShort.End();

            ProfilerShort.End();
        }
예제 #9
0
 IMyStorage IMyVoxelMaps.CreateStorage(byte[] data)
 {
     return(MyStorageBase.Load(data));
 }
        protected override void OnLoad(BitStream stream, Action <MyVoxelBase> loadingDoneHandler)
        {
            MyVoxelBase voxelMap;

            bool isUserCreated = VRage.Serialization.MySerializer.CreateAndRead <bool>(stream);
            bool isFromPrefab  = VRage.Serialization.MySerializer.CreateAndRead <bool>(stream);
            bool rangeChanged  = VRage.Serialization.MySerializer.CreateAndRead <bool>(stream);

            byte[] data         = null;
            string asteroidName = null;

            if (rangeChanged)
            {
                data = VRage.Serialization.MySerializer.CreateAndRead <byte[]>(stream);
            }
            else if (isUserCreated)
            {
                asteroidName = VRage.Serialization.MySerializer.CreateAndRead <string>(stream);
            }

            if (isFromPrefab)
            {
                var builder = VRage.Serialization.MySerializer.CreateAndRead <MyObjectBuilder_EntityBase>(stream, MyObjectBuilderSerializer.Dynamic);

                if (rangeChanged && data != null)
                {
                    IMyStorage storage = MyStorageBase.Load(data);
                    if (MyEntities.TryGetEntityById <MyVoxelBase>(builder.EntityId, out voxelMap))
                    {
                        if (voxelMap is MyVoxelMap)
                        {
                            ((MyVoxelMap)voxelMap).Storage = storage;
                        }
                        else if (voxelMap is MyPlanet)
                        {
                            ((MyPlanet)voxelMap).Storage = storage;
                        }
                        else
                        {
                            Debug.Fail("Unknown voxel kind");
                        }
                    }
                    else
                    {
                        voxelMap = (MyVoxelBase)MyEntities.CreateFromObjectBuilderNoinit(builder);
                        if (voxelMap is MyVoxelMap)
                        {
                            ((MyVoxelMap)voxelMap).Init(builder, storage);
                        }
                        else if (voxelMap is MyPlanet)
                        {
                            ((MyPlanet)voxelMap).Init(builder, storage);
                        }
                        else
                        {
                            Debug.Fail("Unknown voxel kind");
                        }
                        if (voxelMap != null)
                        {
                            MyEntities.Add(voxelMap);
                        }
                    }
                }
                else if (isUserCreated)
                {
                    TryRemoveExistingEntity(builder.EntityId);

                    IMyStorage storage = MyGuiScreenDebugSpawnMenu.CreateAsteroidStorage(asteroidName, 0);
                    voxelMap = (MyVoxelBase)MyEntities.CreateFromObjectBuilderNoinit(builder);
                    if (voxelMap is MyVoxelMap)
                    {
                        ((MyVoxelMap)voxelMap).Init(builder, storage);
                    }
                    if (voxelMap != null)
                    {
                        MyEntities.Add(voxelMap);
                    }
                }
                else
                {
                    TryRemoveExistingEntity(builder.EntityId);

                    voxelMap = (MyVoxelBase)MyEntities.CreateFromObjectBuilderNoinit(builder);
                    if (voxelMap != null)
                    {
                        voxelMap.Init(builder);
                        MyEntities.Add(voxelMap);
                    }
                }
            }
            else
            {
                long voxelMapId = VRage.Serialization.MySerializer.CreateAndRead <long>(stream);
                MyEntities.TryGetEntityById <MyVoxelBase>(voxelMapId, out voxelMap);
            }

            if (voxelMap != null)
            {
                BoundingBoxD voxelBox = new BoundingBoxD(voxelMap.PositionLeftBottomCorner, voxelMap.PositionLeftBottomCorner + voxelMap.SizeInMetres);
                m_entities = MyEntities.GetEntitiesInAABB(ref voxelBox);
                foreach (var entity in m_entities)
                {
                    MyVoxelBase voxel = entity as MyVoxelBase;
                    if (voxel != null)
                    {
                        if (voxel.Save == false && voxel != voxelMap)
                        {
                            voxel.Close();
                            break;
                        }
                    }
                }
                m_entities.Clear();
            }

            loadingDoneHandler(voxelMap);
        }
        protected override void OnLoad(BitStream stream, Action <MyVoxelBase> loadingDoneHandler)
        {
            MyVoxelBase voxelMap;

            bool isUserCreated = VRage.Serialization.MySerializer.CreateAndRead <bool>(stream);
            bool isFromPrefab  = VRage.Serialization.MySerializer.CreateAndRead <bool>(stream);
            bool rangeChanged  = VRage.Serialization.MySerializer.CreateAndRead <bool>(stream);

            byte[] data         = null;
            string asteroidName = null;

            if (rangeChanged)
            {
                data = VRage.Serialization.MySerializer.CreateAndRead <byte[]>(stream);
            }
            else if (isUserCreated)
            {
                asteroidName = VRage.Serialization.MySerializer.CreateAndRead <string>(stream);
            }

            if (isFromPrefab)
            {
                var builder = VRage.Serialization.MySerializer.CreateAndRead <MyObjectBuilder_EntityBase>(stream, MyObjectBuilderSerializer.Dynamic);

                if (rangeChanged && data != null)
                {
                    IMyStorage storage = MyStorageBase.Load(data);
                    if (MyEntities.TryGetEntityById <MyVoxelBase>(builder.EntityId, out voxelMap))
                    {
                        if (voxelMap is MyVoxelMap)
                        {
                            ((MyVoxelMap)voxelMap).Storage = storage;
                        }
                        else if (voxelMap is MyPlanet)
                        {
                            ((MyPlanet)voxelMap).Storage = storage;
                        }
                        else
                        {
                            Debug.Fail("Unknown voxel kind");
                        }
                    }
                    else
                    {
                        voxelMap = (MyVoxelBase)MyEntities.CreateFromObjectBuilderNoinit(builder);
                        if (voxelMap is MyVoxelMap)
                        {
                            ((MyVoxelMap)voxelMap).Init(builder, storage);
                        }
                        else if (voxelMap is MyPlanet)
                        {
                            ((MyPlanet)voxelMap).Init(builder, storage);
                        }
                        else
                        {
                            Debug.Fail("Unknown voxel kind");
                        }
                        MyEntities.Add(voxelMap);
                    }
                }
                else if (isUserCreated)
                {
                    TryRemoveExistingEntity(builder.EntityId);

                    IMyStorage storage = MyGuiScreenDebugSpawnMenu.CreateAsteroidStorage(asteroidName, 0);
                    voxelMap = (MyVoxelBase)MyEntities.CreateFromObjectBuilderNoinit(builder);
                    if (voxelMap is MyVoxelMap)
                    {
                        ((MyVoxelMap)voxelMap).Init(builder, storage);
                    }
                    MyEntities.Add(voxelMap);
                }
                else
                {
                    TryRemoveExistingEntity(builder.EntityId);

                    voxelMap = (MyVoxelBase)MyEntities.CreateFromObjectBuilderNoinit(builder);
                    voxelMap.Init(builder);
                    MyEntities.Add(voxelMap);
                }
            }
            else
            {
                long voxelMapId = VRage.Serialization.MySerializer.CreateAndRead <long>(stream);
                MyEntities.TryGetEntityById <MyVoxelBase>(voxelMapId, out voxelMap);
            }
            loadingDoneHandler(voxelMap);
        }
예제 #12
0
 private void LoadFile(Vector3 position, MyObjectBuilder_VoxelMap objectBuilder)
 {
     m_storage = new MyProxyStorage(objectBuilder.MutableStorage, MyStorageBase.Load(objectBuilder.Name));
     InitVoxelMap(position);
 }