public void Close() { m_fetchedStarSytem = null; m_parentScreen = null; m_currentSelectedAsteroid = null; MyPluginDrawSession.Static.RemoveRenderObject(PREVIEW_RENDER_ID); }
private static void SendGetStarSystemClient(MyObjectBuilder_SystemData starSystem, ulong callbackId) { MyPluginLog.Debug("Client: Received star system"); if (Static.m_getSystemCallbacks.ContainsKey(callbackId)) { Static.m_getSystemCallbacks[callbackId](starSystem); Static.m_getSystemCallbacks.Remove(callbackId); } }
/// <summary> /// Loads the system data xml file from the world folder, or, /// if none exist, returns a new one. /// </summary> /// <returns></returns> private MyObjectBuilder_SystemData LoadSystemData() { if (MyFileUtils.FileExistsInWorldStorage(STORAGE_FILE)) { var data = MyFileUtils.ReadXmlFileFromWorld <MyObjectBuilder_SystemData>(STORAGE_FILE); if (data == null) { data = new MyObjectBuilder_SystemData(); } return(data); } return(new MyObjectBuilder_SystemData()); }
/// <summary> /// Loads the data for the system generator and filters the definition according to /// the global config /// </summary> public override void LoadData() { MyPluginLog.Log("Load Star system generator component"); Static = this; LoadNetworking(); if (!MySettingsSession.Static.IsEnabled()) { return; } MyPluginLog.Log("Loading definitions and network data"); var data = LoadSystemData(); StarSystem = data; MyPluginLog.Log("Loaded system data. Checking Asteroid objects"); if (StarSystem != null && StarSystem.CenterObject != null) { foreach (var obj in StarSystem.GetAllObjects()) { if (obj.Type == MySystemObjectType.ASTEROIDS) { var asteroid = obj as MySystemAsteroids; var provider = MyAsteroidObjectsManager.Static.AsteroidObjectProviders[asteroid.AsteroidTypeName]; if (!provider.TryLoadObject(asteroid)) { MyPluginLog.Log("No data found associated with asteroid object " + asteroid.DisplayName + " (" + asteroid.Id + "), Removing it.", LogLevel.WARNING); StarSystem.RemoveObject(asteroid.Id); } } } } MyPluginLog.Log("All asteroid objects checked"); m_planets = new List <MyPlanetGeneratorDefinition>(); m_moons = new List <MyPlanetGeneratorDefinition>(); m_suns = new List <MyPlanetGeneratorDefinition>(); m_gasGiants = new List <MyPlanetGeneratorDefinition>(); m_mandatoryPlanets = new List <MyPlanetGeneratorDefinition>(); m_mandatoryMoons = new List <MyPlanetGeneratorDefinition>(); MyPluginLog.Log("Load Star system generator component completed"); }
/// <summary> /// Initializes the system generator and generates a new system if enabled and no system was /// generated yet. /// </summary> /// <param name="sessionComponent"></param> public override void Init(MyObjectBuilder_SessionComponent sessionComponent) { MyPluginLog.Log("Initializing Star system generator"); if (!MySettingsSession.Static.IsEnabled()) { MyPluginLog.Log("Plugin is not enabled or client is not the server, aborting"); return; } LoadPlanetDefinitions(); if (StarSystem.Count() <= 0) { StarSystem = GenerateNewStarSystem(); } MyPluginLog.Log("Initializing Star system generator completed"); }
/// <summary> /// Unloads all used data by this component /// </summary> protected override void UnloadData() { MyPluginLog.Log("Unloading star system generation data"); SaveData(); StarSystem = null; m_planets?.Clear(); m_suns?.Clear(); m_gasGiants?.Clear(); m_moons?.Clear(); m_mandatoryPlanets?.Clear(); m_mandatoryMoons?.Clear(); m_uniqueMoons?.Clear(); m_uniquePlanets?.Clear(); UnloadNetworking(); Static = null; MyPluginLog.Log("Unloading star system generation data completed"); }
public bool OnEditMenuSelectItem(float usableWidth, MyGuiControlParentTableLayout parentTable, MyPluginAdminMenu adminScreen, MySystemAsteroids asteroidObject, MyObjectBuilder_SystemData starSystem) { m_parentScreen = adminScreen; m_currentSelectedAsteroid = asteroidObject; m_offset = Vector3D.Zero; m_fetchedStarSytem = starSystem; GenerateRingSettingElements(usableWidth, parentTable); SetSliderValues(m_currentSelectedAsteroid); MyGuiControlButton teleportToRingButton = MyPluginGuiHelper.CreateDebugButton(usableWidth, "Teleport to ring", OnTeleportToRing); parentTable.AddTableRow(teleportToRingButton); MyGuiControlButton deleteRingButton = MyPluginGuiHelper.CreateDebugButton(usableWidth, "Remove ring", OnRemoveRing); parentTable.AddTableRow(deleteRingButton); MyGuiControlButton editRingButton = MyPluginGuiHelper.CreateDebugButton(usableWidth, "Edit ring", OnEditRing); parentTable.AddTableRow(editRingButton); parentTable.AddTableSeparator(); var data = MyAsteroidRingProvider.Static.GetInstanceData(asteroidObject); var ring = data as MyAsteroidRingData; m_parentScreen.CameraLookAt(asteroidObject.CenterPosition, (float)ring.Radius * 1.5f); UpdateRingVisual(ring); return(true); }
public bool OnEditMenuSelectItem(float usableWidth, MyGuiControlParentTableLayout parentTable, MyPluginAdminMenu adminScreen, MySystemAsteroids asteroidObject, MyObjectBuilder_SystemData starSystem) { m_parentScreen = adminScreen; m_currentSelectedAsteroid = asteroidObject; MyGuiControlButton teleportToRingButton = MyPluginGuiHelper.CreateDebugButton(usableWidth, "Teleport to sphere", OnTeleportToSphere); parentTable.AddTableRow(teleportToRingButton); MyGuiControlButton deleteRingButton = MyPluginGuiHelper.CreateDebugButton(usableWidth, "Remove sphere", OnRemoveSphere); parentTable.AddTableRow(deleteRingButton); parentTable.AddTableSeparator(); var data = MyAsteroidSphereProvider.Static.GetInstanceData(asteroidObject); var sphere = data as MyAsteroidSphereData; m_parentScreen.CameraLookAt(asteroidObject.CenterPosition, (float)sphere.OuterRadius * 2f); RenderSpherePreview(sphere); return(true); }
public void Close() { m_fetchedStarSytem = null; MyPluginDrawSession.Static.RemoveRenderObject(PREVIEW_RENDER_ID); }
public bool CreateSpawnMenu(float usableWidth, MyGuiControlParentTableLayout parentTable, MyPluginAdminMenu adminScreen) { m_parentScreen = adminScreen; if (m_fetchedStarSytem == null) { MyGuiControlRotatingWheel loadingWheel = new MyGuiControlRotatingWheel(position: Vector2.Zero); loadingWheel.OriginAlign = MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER; adminScreen.Controls.Add(loadingWheel); MyStarSystemGenerator.Static.GetStarSystem(delegate(MyObjectBuilder_SystemData starSystem) { m_fetchedStarSytem = starSystem; adminScreen.ShouldRecreate = true; }); return(true); } MyGuiControlLabel label = new MyGuiControlLabel(null, null, "Parent objects"); parentTable.AddTableRow(label); m_parentObjectListBox = new MyGuiControlListbox(); m_parentObjectListBox.Add(new MyGuiControlListbox.Item(new System.Text.StringBuilder("System center"), userData: m_fetchedStarSytem.CenterObject)); m_parentObjectListBox.VisibleRowsCount = 8; m_parentObjectListBox.Size = new Vector2(usableWidth, m_parentObjectListBox.Size.Y); m_parentObjectListBox.SelectAllVisible(); m_parentObjectListBox.ItemsSelected += OnParentItemClicked; foreach (var obj in m_fetchedStarSytem.CenterObject.GetAllChildren()) { if (obj.Type == MySystemObjectType.PLANET || obj.Type == MySystemObjectType.MOON) { m_parentObjectListBox.Add(new MyGuiControlListbox.Item(new System.Text.StringBuilder(obj.DisplayName), userData: obj)); } } parentTable.AddTableRow(m_parentObjectListBox); parentTable.AddTableSeparator(); m_radiusSlider = new MyGuiControlClickableSlider(width: usableWidth - 0.1f, minValue: 0, maxValue: 1, labelSuffix: " km", showLabel: true); m_radiusSlider.Enabled = false; m_radiusSlider.ValueChanged += delegate { RenderSpherePreview(GetDataFromGui()); }; parentTable.AddTableRow(new MyGuiControlLabel(null, null, "Radius")); parentTable.AddTableRow(m_radiusSlider); m_widthSlider = new MyGuiControlClickableSlider(null, 0, 1, usableWidth - 0.1f, 0.5f, showLabel: true, labelSuffix: " km"); m_widthSlider.Enabled = false; m_widthSlider.ValueChanged += delegate { RenderSpherePreview(GetDataFromGui()); }; parentTable.AddTableRow(new MyGuiControlLabel(null, null, "Width")); parentTable.AddTableRow(m_widthSlider); m_asteroidSizesSlider = new MyGuiControlRangedSlider(32, 1024, 32, 1024, true, width: usableWidth - 0.1f, showLabel: true); m_asteroidSizesSlider.Enabled = false; parentTable.AddTableRow(new MyGuiControlLabel(null, null, "Asteroid size range")); parentTable.AddTableRow(m_asteroidSizesSlider); m_nameBox = new MyGuiControlTextbox(); m_nameBox.Size = new Vector2(usableWidth, m_nameBox.Size.Y); parentTable.AddTableRow(new MyGuiControlLabel(null, null, "Name")); parentTable.AddTableRow(m_nameBox); m_spawnButton = MyPluginGuiHelper.CreateDebugButton(usableWidth, "Spawn sphere", delegate { StringBuilder name = new StringBuilder(); m_nameBox.GetText(name); if (name.Length < 4) { MyPluginGuiHelper.DisplayError("Name must be at least 4 letters long", "Error"); return; } MySystemAsteroids instance; MyAsteroidSphereData data; GenerateData(out instance, out data); if (instance == null || data == null) { MyPluginGuiHelper.DisplayError("Could not generate asteroid sphere. No data found.", "Error"); return; } MyAsteroidSphereProvider.Static.AddInstance(instance, data, delegate(bool success) { if (!success) { MyPluginGuiHelper.DisplayError("Sphere could not be added, because an object with the same id already exists. This error should not occour, so please try again.", "Error"); } else { MyPluginGuiHelper.DisplayMessage("Sphere was created successfully.", "Success"); m_parentScreen.ForceFetchStarSystem = true; m_parentScreen.ShouldRecreate = true; } }); }); parentTable.AddTableSeparator(); parentTable.AddTableRow(m_spawnButton); return(true); }
/// <summary> /// Generates a completely new system based on the /// world settings. /// </summary> /// <returns></returns> private MyObjectBuilder_SystemData GenerateNewStarSystem() { MyPluginLog.Log("Generating a new Solar system ..."); int seed = MySession.Static.Settings.ProceduralSeed + Guid.NewGuid().GetHashCode(); MyObjectBuilder_SystemData system = new MyObjectBuilder_SystemData(); var settings = MySettingsSession.Static.Settings.GeneratorSettings; var orbitDistances = settings.MinMaxOrbitDistance; var planetsAmount = settings.MinMaxPlanets; var asteroidObjectAmount = settings.MinMaxAsteroidObjects; var worldSize = settings.WorldSize; var asteroidProviders = MyAsteroidObjectsManager.Static.AsteroidObjectProviders; using (MyRandom.Instance.PushSeed(seed)) { long planetCount = MyRandom.Instance.Next(planetsAmount.Min, planetsAmount.Max + 1); long asteroidObjectCount = MyRandom.Instance.Next(asteroidObjectAmount.Min, asteroidObjectAmount.Max + 1); long systemSize = planetCount + asteroidObjectCount; int currentPlanetIndex = 0; int currentAsteroidIndex = 0; long currentOrbitDistance = 0; double planetProb = planetCount / (double)(planetCount + asteroidObjectCount); if (m_suns.Count > 0) { MyPlanetGeneratorDefinition sunDef = m_suns[MyRandom.Instance.Next(0, m_suns.Count)]; MySystemPlanet sun = new MySystemPlanet(); sun.CenterPosition = Vector3D.Zero; sun.SubtypeId = sunDef.Id.SubtypeId.String; sun.DisplayName = sunDef.Id.SubtypeId.String; sun.Diameter = CalculatePlanetDiameter(sunDef) * 2; sun.ChildObjects = new HashSet <MySystemObject>(); sun.Generated = false; sun.Type = MySystemObjectType.PLANET; system.CenterObject = sun; currentOrbitDistance += (long)sun.Diameter * 2 + (long)sunDef.AtmosphereHeight; } else { system.CenterObject = new MySystemObject(); system.CenterObject.Type = MySystemObjectType.EMPTY; system.CenterObject.DisplayName = "System center"; } while (planetCount > 0 || asteroidObjectCount > 0) { currentOrbitDistance += MyRandom.Instance.Next(orbitDistances.Min, orbitDistances.Max); //Maybe rework to override orbit distance, so all objects fit if (worldSize >= 0 && currentOrbitDistance >= worldSize) { return(system); } MySystemObject obj = null; if (asteroidObjectCount <= 0 || (MyRandom.Instance.NextDouble() <= planetProb && planetCount > 0)) // Generate planet { obj = GeneratePlanet(currentPlanetIndex++, Math.Sin((system.Count() - 1) * Math.PI / systemSize), currentOrbitDistance); planetCount--; } else if (asteroidObjectCount > 0) // Generate asteroid object { int providerIndex = MyRandom.Instance.Next(0, asteroidProviders.Keys.Count); MyAbstractAsteroidObjectProvider provider = null; foreach (var prov in asteroidProviders) { if (!prov.Value.IsSystemGeneratable()) { continue; } if (providerIndex-- == 0) { provider = prov.Value; } } if (provider == null) { continue; } obj = provider.GenerateInstance(currentAsteroidIndex++, null, currentOrbitDistance); if (obj == null) { continue; } (obj as MySystemAsteroids).AsteroidTypeName = provider.GetTypeName(); asteroidObjectCount--; } if (obj == null) { continue; } obj.ParentId = system.CenterObject.Id; system.CenterObject.ChildObjects.Add(obj); } } MyPluginLog.Log("Solar system generated ..."); return(system); }
/// <summary> /// Builds the edit menu /// </summary> private void BuildEditMenu() { MyPluginLog.Debug("Adding edit menu"); if (m_fetchedStarSytem == null || ForceFetchStarSystem) { MyPluginLog.Debug("Fetching system data"); MyGuiControlRotatingWheel m_loadingWheel = new MyGuiControlRotatingWheel(position: Vector2.Zero); m_loadingWheel.OriginAlign = MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER; Controls.Add(m_loadingWheel); MyStarSystemGenerator.Static.GetStarSystem(delegate(MyObjectBuilder_SystemData starSystem) { m_fetchedStarSytem = starSystem; m_selectedObject = null; ShouldRecreate = true; ForceFetchStarSystem = false; }); return; } var topCombo = GetCombo(); Vector2 start = topCombo.Position + new Vector2(0, MARGIN_VERT * 2 + GetCombo().Size.Y); Vector2 end = start + new Vector2(topCombo.Size.X, 0.8f - MARGIN_VERT); MyGuiControlLabel systemObjsLabel = new MyGuiControlLabel(null, null, "System Objects"); systemObjsLabel.OriginAlign = MyGuiDrawAlignEnum.HORISONTAL_LEFT_AND_VERTICAL_TOP; systemObjsLabel.Position = start; Controls.Add(systemObjsLabel); m_systemObjectsBox = new MyGuiControlListbox(); m_systemObjectsBox.VisibleRowsCount = 8; m_systemObjectsBox.Size = new Vector2(m_usableWidth, m_systemObjectsBox.Size.Y); m_systemObjectsBox.Position = start; m_systemObjectsBox.PositionY += systemObjsLabel.Size.Y + MARGIN_VERT; m_systemObjectsBox.OriginAlign = MyGuiDrawAlignEnum.HORISONTAL_LEFT_AND_VERTICAL_TOP; foreach (var obj in m_fetchedStarSytem.GetAllObjects()) { if (obj.Type == MySystemObjectType.EMPTY) { continue; } m_systemObjectsBox.Add(new MyGuiControlListbox.Item(new System.Text.StringBuilder(obj.DisplayName), userData: obj)); } if (m_selectedObject != null) { m_systemObjectsBox.SelectByUserData(m_selectedObject); } m_systemObjectsBox.ItemsSelected += OnSystemObjectSelect; Controls.Add(m_systemObjectsBox); MyGuiControlSeparatorList sep = new MyGuiControlSeparatorList(); sep.AddHorizontal(new Vector2(m_systemObjectsBox.Position.X, m_systemObjectsBox.Position.Y + m_systemObjectsBox.Size.Y + MARGIN_VERT), m_usableWidth); BuildEditingSubMenu(); sep.AddHorizontal(new Vector2(m_scrollPane.Position.X - m_scrollPane.Size.X / 2, m_scrollPane.Position.Y + m_scrollPane.Size.Y), m_usableWidth); Controls.Add(sep); MyPluginLog.Debug("Added edit menu"); }
public bool CreateSpawnMenu(float usableWidth, MyGuiControlParentTableLayout parentTable, MyPluginAdminMenu adminScreen) { m_parentScreen = adminScreen; m_offset = Vector3D.Zero; m_currentSelectedAsteroid = null; if (m_fetchedStarSytem == null) { MyGuiControlRotatingWheel m_loadingWheel = new MyGuiControlRotatingWheel(position: Vector2.Zero); m_loadingWheel.OriginAlign = MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER; adminScreen.Controls.Add(m_loadingWheel); MyStarSystemGenerator.Static.GetStarSystem(delegate(MyObjectBuilder_SystemData starSystem) { m_fetchedStarSytem = starSystem; adminScreen.ShouldRecreate = true; }); return(true); } MyGuiControlLabel label = new MyGuiControlLabel(null, null, "Parent objects"); parentTable.AddTableRow(label); m_parentObjectListBox = new MyGuiControlListbox(); m_parentObjectListBox.Add(new MyGuiControlListbox.Item(new System.Text.StringBuilder("System center"), userData: m_fetchedStarSytem.CenterObject)); m_parentObjectListBox.VisibleRowsCount = 8; m_parentObjectListBox.Size = new Vector2(usableWidth, m_parentObjectListBox.Size.Y); m_parentObjectListBox.SelectAllVisible(); m_parentObjectListBox.ItemsSelected += OnParentItemClicked; foreach (var obj in m_fetchedStarSytem.CenterObject.GetAllChildren()) { if (obj.Type == MySystemObjectType.PLANET || obj.Type == MySystemObjectType.MOON) { m_parentObjectListBox.Add(new MyGuiControlListbox.Item(new System.Text.StringBuilder(obj.DisplayName), userData: obj)); } } parentTable.AddTableRow(m_parentObjectListBox); var row = new MyGuiControlParentTableLayout(2, false, Vector2.Zero); m_snapToParentCheck = new MyGuiControlCheckbox(); m_snapToParentCheck.IsChecked = m_snapToParent; m_snapToParentCheck.IsCheckedChanged += delegate { m_snapToParent = m_snapToParentCheck.IsChecked; m_zoomInButton.Enabled = m_snapToParent; }; row.AddTableRow(m_snapToParentCheck, new MyGuiControlLabel(null, null, "Snap camera to parent")); row.ApplyRows(); parentTable.AddTableRow(row); parentTable.AddTableSeparator(); GenerateRingSettingElements(usableWidth, parentTable); m_nameBox = new MyGuiControlTextbox(); m_nameBox.Size = new Vector2(usableWidth, m_nameBox.Size.Y); parentTable.AddTableRow(new MyGuiControlLabel(null, null, "Name")); parentTable.AddTableRow(m_nameBox); m_zoomInButton = MyPluginGuiHelper.CreateDebugButton(usableWidth, "Zoom to ring", delegate { if (m_snapToParent) { m_parentScreen.CameraLookAt(GenerateAsteroidRing().CenterPosition, new Vector3D(0, 0, (m_radiusSlider.Value + m_widthSlider.Value) * 2000)); } }); parentTable.AddTableRow(m_zoomInButton); m_offsetToCoordButton = MyPluginGuiHelper.CreateDebugButton(usableWidth, "Offset to coordinate", delegate { var coordMessage = new MyGuiScreenDialogCoordinate("Enter coordinate to offset the center of the ring from its parent"); coordMessage.OnConfirmed += delegate(Vector3D coord) { m_offset = coord; UpdateRingVisual(GenerateAsteroidRing()); }; MyGuiSandbox.AddScreen(coordMessage); }); parentTable.AddTableRow(m_offsetToCoordButton); m_spawnRingButton = MyPluginGuiHelper.CreateDebugButton(usableWidth, "Add ring", delegate { StringBuilder name = new StringBuilder(); m_nameBox.GetText(name); if (name.Length < 4) { MyPluginGuiHelper.DisplayError("Name must be at least 4 letters long", "Error"); return; } MySystemAsteroids instance; MyAsteroidRingData ring; GenerateAsteroidData(out ring, out instance); if (ring == null || instance == null) { MyPluginGuiHelper.DisplayError("Could not generate asteroid ring. No data found.", "Error"); return; } MyAsteroidRingProvider.Static.AddInstance(instance, ring, delegate(bool success) { if (!success) { MyPluginGuiHelper.DisplayError("Ring could not be added, because an object with the same id already exists. This error should not occour, so please try again.", "Error"); } else { MyPluginGuiHelper.DisplayMessage("Ring was created successfully.", "Success"); m_parentScreen.ForceFetchStarSystem = true; m_parentScreen.ShouldRecreate = true; } }); }); parentTable.AddTableRow(m_spawnRingButton); return(true); }