private void GeneratePlanet(int index, long distance, int totalObjects, ref int planetIndex) { MyPlanetItem planet = new MyPlanetItem(); double mod = distance == 0 && m_settings.FirstPlanetCenter ? 1 : Math.Sin(index * Math.PI / totalObjects); var def = GetPlanetDefinition((int)(m_settings.PlanetSettings.PlanetSizeCap * mod)); bool isGasGiant = m_gasGiants.Contains(def); var size = SizeByGravity(def.SurfaceGravity, isGasGiant); var angle = MyRandom.Instance.GetRandomFloat(0, (float)(2 * Math.PI)); var height = MyRandom.Instance.GetRandomFloat((float)Math.PI / 180 * -5, (float)Math.PI / 180 * 5); Vector3D pos = new Vector3D(distance * Math.Sin(angle), distance * Math.Cos(angle), distance * Math.Sin(height)); string name = SettingsSession.Static.Settings.GeneratorSettings.PlanetSettings.PlanetNameFormat .SetProperty("ObjectNumber", planetIndex + 1) .SetProperty("ObjectNumberGreek", greek_letters[planetIndex]) .SetProperty("ObjectLetterLower", (char)('a' + (planetIndex % 26))) .SetProperty("ObjectLetterUpper", (char)('A' + (planetIndex % 26))) .SetProperty("ObjectId", def.Id.SubtypeId.String); ++planetIndex; planet.DisplayName = name; planet.Type = SystemObjectType.PLANET; planet.DefName = def.Id.SubtypeId.String; planet.Size = size; planet.PlanetRing = GenerateRing(def.SurfaceGravity, planet.Size); planet.OffsetPosition = pos; planet.CenterPosition = pos; planet.PlanetMoons = GenerateMoons(planet.Size, def.SurfaceGravity, planet.DisplayName, distance); planet.Generated = false; m_objects.Add(planet); }
private void GeneratePlanet(int index, long distance, int totalObjects, ref int planetIndex) { MyPlanetItem planet = new MyPlanetItem(); double mod = distance == 0 && m_settings.FirstPlanetCenter ? 1 : Math.Sin(index * Math.PI / totalObjects); var def = GetPlanetDefinition((int)(m_settings.PlanetSettings.PlanetSizeCap * mod)); var size = SizeByGravity(def.SurfaceGravity); var angle = MyRandom.Instance.GetRandomFloat(0, (float)(2 * Math.PI)); var height = MyRandom.Instance.GetRandomFloat((float)Math.PI / 180 * -5, (float)Math.PI / 180 * 5); Vector3D pos = new Vector3D(distance * Math.Sin(angle), distance * Math.Cos(angle), distance * Math.Sin(height)); planet.DisplayName = "Planet " + (++planetIndex); planet.Type = SystemObjectType.PLANET; planet.DefName = def.Id.SubtypeId.String; planet.Size = size; planet.PlanetRing = GenerateRing(def.SurfaceGravity, planet.Size); planet.OffsetPosition = pos; planet.CenterPosition = pos; planet.PlanetMoons = GenerateMoons(planet.Size, def.SurfaceGravity, planet.DisplayName, distance); planet.Generated = false; m_objects.Add(planet); }
static void SendAddPlanet(MyPlanetItem planet, ulong callback, ulong client) { if (planet != null) { if (Static.TryGetObject(planet.DisplayName, out MySystemItem obj)) { if (obj.Type == SystemObjectType.PLANET) { if (((MyPlanetItem)obj).Generated) { return; } } else { return; } Static.Objects.Remove(obj); } Static.Objects.Add(planet); PluginEventHandler.Static.RaiseStaticEvent(SendAddCallbackClient, true, callback, client); return; } PluginEventHandler.Static.RaiseStaticEvent(SendAddCallbackClient, false, callback, client); }
private MySystemItem IsInsideRing(Vector3D position) { foreach (MySystemItem p in SystemGenerator.Static.m_objects) { if (p.Type == SystemObjectType.PLANET) { MyPlanetItem planet = (MyPlanetItem)p; if (planet.PlanetRing == null) { continue; } AsteroidRingShape shape = AsteroidRingShape.CreateFromRingItem(planet.PlanetRing); if (shape.Contains(position) == ContainmentType.Contains) { return(planet.PlanetRing); } } else if (p.Type == SystemObjectType.BELT) { MySystemBeltItem belt = (MySystemBeltItem)p; AsteroidBeltShape shape = AsteroidBeltShape.CreateFromRingItem(belt); if (shape.Contains(position) == ContainmentType.Contains) { return(belt); } } } return(null); }
static void SendGetServer(ulong client, string name, ulong callback) { bool success = Static.TryGetObject(name, out MySystemItem item); if (item == null) { item = new MyPlanetItem(); } switch (item.Type) { case SystemObjectType.PLANET: PluginEventHandler.Static.RaiseStaticEvent(SendGetPlanetClient, success, (MyPlanetItem)item, callback, client); break; case SystemObjectType.BELT: PluginEventHandler.Static.RaiseStaticEvent(SendGetBeltClient, success, (MySystemBeltItem)item, callback, client); break; case SystemObjectType.RING: PluginEventHandler.Static.RaiseStaticEvent(SendGetRingClient, success, (MyPlanetRingItem)item, callback, client); break; case SystemObjectType.MOON: PluginEventHandler.Static.RaiseStaticEvent(SendGetMoonClient, success, (MyPlanetMoonItem)item, callback, client); break; default: break; } }
private void SpawnPlanet(MySystemItem planet, Vector3D position) { if (planet.Type == SystemObjectType.PLANET) { MyPlanetItem p = (MyPlanetItem)planet; p.CenterPosition = position; SystemGenerator.Static.AddPlanet(p); } }
/// <summary> /// Rebuilds the UI of the menu, by replacing the combo box at the top, with /// a new one with new selectable options, and checks, if a plugin menu should be shown and when yes, /// which one, otherwise shows the corresponding vanilla menu /// </summary> /// <param name="constructor">Whether this is run from constructor</param> public override void RecreateControls(bool constructor) { base.RecreateControls(constructor); MyGuiControlCombobox modeCombo = GetCombo(); int oldCount = modeCombo.GetItemsCount(); if (MySession.Static.IsUserSpaceMaster(Sync.MyId) && MySession.Static.IsUserAdmin(Sync.MyId)) { modeCombo.AddItem(oldCount, "SEWorldGenPlugin - Rings"); modeCombo.AddItem(oldCount + 1, "SEWorldGenPlugin - Planets"); } MyGuiControlCombobox newCombo = AddCombo(); int count = modeCombo.GetItemsCount(); for (int i = 0; i < count; i++) { var item = modeCombo.GetItemByIndex(i); newCombo.AddItem(item.Key, item.Value); } newCombo.Position = modeCombo.Position; newCombo.SelectItemByKey(m_currentKey); Controls[Controls.IndexOf(modeCombo)] = newCombo; Controls.Remove(modeCombo); newCombo.ItemSelected += delegate { m_currentKey = newCombo.GetSelectedKey(); if (newCombo.GetSelectedKey() >= oldCount) { RecreateControls(false); } else { m_attachedEntity = 0L; m_selectedPlanet = null; modeCombo.SelectItemByKey(newCombo.GetSelectedKey()); RecreateControls(false); } }; if (newCombo.GetSelectedKey() == oldCount) { ClearControls(); CheckBuildPluginControls(BuildRingMenu); } else if (newCombo.GetSelectedKey() == oldCount + 1) { ClearControls(); CheckBuildPluginControls(BuildPlanetMenu); } }
private void OnTeleportToRingButton(MyGuiControlButton button) { if (MySession.Static.CameraController != MySession.Static.LocalCharacter) { CloseScreen(); AsteroidRingShape shape = AsteroidRingShape.CreateFromRingItem(m_selectedPlanet.PlanetRing); MyMultiplayer.TeleportControlledEntity(shape.LocationInRing(0)); m_attachedEntity = 0L; m_selectedPlanet = null; MyGuiScreenGamePlay.SetCameraController(); } }
static void SendRemoveRingFromPlanet(string planetName) { if (Static.TryGetObject(planetName, out MySystemItem obj)) { if (obj.Type == SystemObjectType.PLANET) { MyPlanetItem planet = (MyPlanetItem)obj; if (planet.PlanetRing != null) { planet.PlanetRing = null; } } } }
static void SendAddRingToPlanet(string planetName, MyPlanetRingItem ringBase) { if (Static.TryGetObject(planetName, out MySystemItem obj)) { if (obj.Type == SystemObjectType.PLANET) { MyPlanetItem planet = (MyPlanetItem)obj; if (planet.PlanetRing == null) { ringBase.Center = planet.CenterPosition; planet.PlanetRing = ringBase; } } } }
public void AddPlanet(MyPlanetItem planet) { if (!m_handshakeDone) { NetUtil.PingServer(delegate //Handshake needed to know, that server runs plugin { m_handshakeDone = true; PluginEventHandler.Static.RaiseStaticEvent(SendAddPlanet, planet, null); }); } else { PluginEventHandler.Static.RaiseStaticEvent(SendAddPlanet, planet, null); } }
static void SendRemoveRingFromPlanet(string planetName, ulong callback, ulong client) { if (Static.TryGetObject(planetName, out MySystemItem obj)) { if (obj.Type == SystemObjectType.PLANET) { MyPlanetItem planet = (MyPlanetItem)obj; if (planet.PlanetRing != null) { planet.PlanetRing = null; PluginEventHandler.Static.RaiseStaticEvent(SendAddCallbackClient, true, callback, client); return; } } } PluginEventHandler.Static.RaiseStaticEvent(SendAddCallbackClient, false, callback, client); }
static void SendAddRingToPlanet(string planetName, MyPlanetRingItem ringBase, ulong callback, ulong client) { if (Static.TryGetObject(planetName, out MySystemItem obj)) { if (obj.Type == SystemObjectType.PLANET) { MyPlanetItem planet = (MyPlanetItem)obj; if (planet.PlanetRing == null) { ringBase.Center = planet.CenterPosition; planet.PlanetRing = ringBase; PluginEventHandler.Static.RaiseStaticEvent(SendAddCallbackClient, true, callback, client); return; } } } PluginEventHandler.Static.RaiseStaticEvent(SendAddCallbackClient, false, callback, client); }
static void SendAddPlanet(MyPlanetItem planet) { if (planet != null) { if (Static.TryGetObject(planet.DisplayName, out MySystemItem obj)) { if (obj.Type == SystemObjectType.PLANET) { if (((MyPlanetItem)obj).Generated) { return; } } else { return; } Static.m_objects.Remove(obj); } Static.m_objects.Add(planet); } }
private void OnSpawnPlanetButton(MyGuiControlButton button) { if (m_planetDefListBox.SelectedItems.Count > 0) { float size = m_planetSizeSlider.Value * 1000; MyPlanetItem planet = new MyPlanetItem() { OffsetPosition = Vector3D.Zero, DefName = m_selectedDefinition.Id.SubtypeId.ToString(), DisplayName = m_selectedDefinition.Id.SubtypeId.ToString() + "_" + size + "_" + MyRandom.Instance.Next(), Generated = false, PlanetMoons = new MyPlanetMoonItem[0], PlanetRing = null, Size = size, Type = SystemObjectType.PLANET, CenterPosition = Vector3D.Zero }; PluginItemsClipboard.Static.Activate(planet, SpawnPlanet, size); CloseScreenNow(); } }
private void PlanetListItemClicked(MyGuiControlListbox box) { if (box.SelectedItems.Count > 0) { MyEntityList.MyEntityListInfoItem myEntityListInfoItem = (MyEntityList.MyEntityListInfoItem)box.SelectedItems[box.SelectedItems.Count - 1].UserData; m_attachedEntity = myEntityListInfoItem.EntityId; if (!TryAttachCamera(myEntityListInfoItem.EntityId)) { MySession.Static.SetCameraController(MyCameraControllerEnum.Spectator, null, myEntityListInfoItem.Position + Vector3.One * 50f); } MyPlanet planetEntity = (MyPlanet)MyEntities.GetEntityById(myEntityListInfoItem.EntityId); string name = ""; if (myEntityListInfoItem.DisplayName.StartsWith("Planet")) { name = myEntityListInfoItem.DisplayName.Replace("_", " ").Split('-')[0].Trim(); } else { name = myEntityListInfoItem.DisplayName.Replace("_", " "); } if (m_selectedPlanet != null) { PluginDrawSession.Static.RemoveRenderObject(m_selectedPlanet.GetHashCode()); } SystemGenerator.Static.GetObject(name, delegate(bool success, MySystemItem obj) { if (success) { m_selectedPlanet = (MyPlanetItem)obj; m_newPlanet = false; } else { m_selectedPlanet = new MyPlanetItem() { DisplayName = myEntityListInfoItem.DisplayName.Replace("_", " "), CenterPosition = planetEntity.PositionComp.GetPosition(), DefName = ((MyObjectBuilder_Planet)planetEntity.GetObjectBuilder()).Name, Generated = true, OffsetPosition = planetEntity.PositionLeftBottomCorner, PlanetMoons = new MyPlanetMoonItem[0], PlanetRing = null, Size = planetEntity.AverageRadius * 2, Type = SystemObjectType.PLANET }; m_newPlanet = true; } m_ringDistanceSlider.MinValue = planetEntity.AverageRadius * 2 * 0.75f - planetEntity.AverageRadius; m_ringDistanceSlider.MinValue -= m_ringDistanceSlider.MinValue % 1000; m_ringDistanceSlider.MaxValue = planetEntity.AverageRadius * 2 * 2 - planetEntity.AverageRadius; m_ringDistanceSlider.MaxValue -= m_ringDistanceSlider.MaxValue % 1000; m_ringDistanceSlider.Value = planetEntity.AverageRadius * 2 * 1.25f - planetEntity.AverageRadius; m_ringDistanceSlider.Value -= m_ringDistanceSlider.Value % 1000; bool hasRing = m_selectedPlanet.PlanetRing != null; m_ringAngleXSlider.Enabled = !hasRing; m_ringAngleYSlider.Enabled = !hasRing; m_ringAngleZSlider.Enabled = !hasRing; m_ringDistanceSlider.Enabled = !hasRing; m_ringWidthSlider.Enabled = !hasRing; m_ringRoidSizeSlider.Enabled = !hasRing; m_ringRoidSizeMaxSlider.Enabled = !hasRing; m_addRingButton.Enabled = !hasRing; m_removeRingButton.Enabled = hasRing; m_teleportToRingButton.Enabled = hasRing; if (hasRing) { m_ringDistanceSlider.Value = (float)m_selectedPlanet.PlanetRing.Radius - m_selectedPlanet.Size / 2; m_ringWidthSlider.Value = m_selectedPlanet.PlanetRing.Width; m_ringAngleZSlider.Value = m_selectedPlanet.PlanetRing.AngleDegrees; m_ringAngleYSlider.Value = m_selectedPlanet.PlanetRing.AngleDegreesY; m_ringAngleXSlider.Value = m_selectedPlanet.PlanetRing.AngleDegreesX; m_ringRoidSizeSlider.Value = m_selectedPlanet.PlanetRing.RoidSize; m_ringRoidSizeMaxSlider.Value = m_selectedPlanet.PlanetRing.RoidSizeMax; } else { m_ringWidthSlider.Value = m_ringWidthSlider.DefaultValue.Value; m_ringAngleXSlider.Value = m_ringAngleXSlider.DefaultValue.Value; m_ringAngleYSlider.Value = m_ringAngleXSlider.DefaultValue.Value; m_ringAngleZSlider.Value = m_ringAngleXSlider.DefaultValue.Value; m_ringRoidSizeSlider.Value = m_ringRoidSizeSlider.MinValue; m_ringRoidSizeMaxSlider.Value = m_ringRoidSizeMaxSlider.MaxValue; m_ringRoidSizeSlider.Value = m_ringRoidSizeSlider.DefaultValue.Value; m_ringRoidSizeMaxSlider.Value = m_ringRoidSizeMaxSlider.DefaultValue.Value; } m_ringRoidSizeValue.Text = m_ringRoidSizeSlider.Value.ToString(); m_ringAngleXValue.Text = String.Format("{0:0.00}", m_ringAngleXSlider.Value); m_ringAngleYValue.Text = String.Format("{0:0.00}", m_ringAngleYSlider.Value); m_ringAngleZValue.Text = String.Format("{0:0.00}", m_ringAngleZSlider.Value); m_ringWidthValue.Text = m_ringWidthSlider.Value.ToString(); m_ringDistanceValue.Text = m_ringDistanceSlider.Value.ToString(); UpdateRingVisual(); }); } }
public void GeneratePlanets() { foreach (var obj in SystemGenerator.Static.m_objects) { if (obj == null) { continue; } if (obj.Type != SystemObjectType.PLANET) { continue; } MyPlanetItem planet = (MyPlanetItem)obj; if (planet.Generated) { continue; } MyPlanetGeneratorDefinition definition = GetDefinition(planet.DefName); if (definition == null) { continue; } long id = MyRandom.Instance.NextLong(); string name = (planet.DisplayName + " - " + definition.Id.SubtypeId).Replace(" ", "_"); if (planet.CenterPosition.Equals(Vector3D.Zero)) { planet.CenterPosition = planet.OffsetPosition; } MyPlanet generatedPlanet = MyWorldGenerator.AddPlanet(name, planet.DisplayName, planet.DefName, planet.CenterPosition - GetPlanetOffset(definition, planet.Size), m_seed, planet.Size, true, id, false, true); if (generatedPlanet == null) { continue; } planet.CenterPosition = generatedPlanet.PositionComp.GetPosition(); generatedPlanet.DisplayNameText = planet.DisplayName; generatedPlanet.AsteroidName = planet.DisplayName; if (planet.PlanetRing != null) { planet.PlanetRing.Center = planet.CenterPosition; } List <Vector3D> spawnedMoons = new List <Vector3D>(); for (int i = 0; i < planet.PlanetMoons.Length; i++) { MyPlanetMoonItem moon = planet.PlanetMoons[i]; if (moon == null) { continue; } MyPlanetGeneratorDefinition moonDef = GetDefinition(moon.DefName); if (moonDef == null) { continue; } var position = new Vector3D(0, 0, 0); long mId = MyRandom.Instance.NextLong(); string storageNameMoon = ("Moon " + moon.DisplayName + " - " + moonDef.Id.SubtypeId).Replace(" ", "_"); var threshold = 0; do { double angle = MyRandom.Instance.GetRandomFloat(0, (float)Math.PI * 2f); position = new Vector3D(moon.Distance * Math.Sin(angle), moon.Distance * Math.Cos(angle), moon.Distance * Math.Sin(MyRandom.Instance.GetRandomFloat((float)-Math.PI / 2, (float)Math.PI / 2))); position = Vector3D.Add(planet.CenterPosition, position); threshold++; } while (ObstructedPlace(position, spawnedMoons, planet.Size, planet.PlanetRing) && threshold < 10000); MyPlanet spawnedMoon = MyWorldGenerator.AddPlanet(storageNameMoon, moon.DisplayName, moon.DefName, position, m_seed, moon.Size, true, mId, false, true); spawnedMoons.Add(spawnedMoon.PositionComp.GetPosition()); if (SettingsSession.Static.Settings.GeneratorSettings.PlanetSettings.ShowMoonGPS) { GlobalGpsManager.Static.AddGps(moon.DisplayName, Color.Aqua, spawnedMoon.PositionComp.GetPosition()); } } planet.Generated = true; if (SettingsSession.Static.Settings.GeneratorSettings.PlanetSettings.ShowPlanetGPS) { GlobalGpsManager.Static.AddGps(planet.DisplayName, Color.Aqua, generatedPlanet.PositionComp.GetPosition()); } } }
/// <summary> /// Callback, for when a planet in the planet list is clicked /// Loads all slider values, if a ring is present, if not it initializes them /// with respective limits to the planet /// </summary> /// <param name="box">Listbox that got clicked</param> private void PlanetListItemClicked(MyGuiControlListbox box) { if (box.SelectedItems.Count > 0) { var data = (Tuple <MySystemItem, MyEntityList.MyEntityListInfoItem>)box.SelectedItems[box.SelectedItems.Count - 1].UserData; MyEntityList.MyEntityListInfoItem myEntityListInfoItem = data.Item2; MyPlanetItem planet = (MyPlanetItem)data.Item1; MyPlanet entityPlanet = (MyPlanet)MyEntities.GetEntityById(myEntityListInfoItem.EntityId); m_attachedEntity = myEntityListInfoItem.EntityId; if (SNAP_CAMERA_TO_PLANET && !TryAttachCamera(myEntityListInfoItem.EntityId)) { MySession.Static.SetCameraController(MyCameraControllerEnum.Spectator, null, myEntityListInfoItem.Position + Vector3.One * 50f); } if (m_selectedPlanet != null) { PluginDrawSession.Static.RemoveRenderObject(m_selectedPlanet.GetHashCode()); } m_selectedPlanet = planet; m_newPlanet = false; m_ringDistanceSlider.MinValue = entityPlanet.AverageRadius * 2 * 0.75f - entityPlanet.AverageRadius; m_ringDistanceSlider.MinValue -= m_ringDistanceSlider.MinValue % 1000; m_ringDistanceSlider.MaxValue = entityPlanet.AverageRadius * 2 * 2 - entityPlanet.AverageRadius; m_ringDistanceSlider.MaxValue -= m_ringDistanceSlider.MaxValue % 1000; m_ringDistanceSlider.Value = entityPlanet.AverageRadius * 2 * 1.25f - entityPlanet.AverageRadius; m_ringDistanceSlider.Value -= m_ringDistanceSlider.Value % 1000; bool hasRing = m_selectedPlanet.PlanetRing != null; m_ringAngleXSlider.Enabled = !hasRing; m_ringAngleYSlider.Enabled = !hasRing; m_ringAngleZSlider.Enabled = !hasRing; m_ringDistanceSlider.Enabled = !hasRing; m_ringWidthSlider.Enabled = !hasRing; m_ringRoidSizeSlider.Enabled = !hasRing; m_ringRoidSizeMaxSlider.Enabled = !hasRing; m_addRingButton.Enabled = !hasRing; m_removeRingButton.Enabled = hasRing; m_teleportToRingButton.Enabled = hasRing; if (hasRing) { m_ringDistanceSlider.Value = (float)m_selectedPlanet.PlanetRing.Radius - m_selectedPlanet.Size / 2; m_ringWidthSlider.Value = m_selectedPlanet.PlanetRing.Width; m_ringAngleZSlider.Value = m_selectedPlanet.PlanetRing.AngleDegrees; m_ringAngleYSlider.Value = m_selectedPlanet.PlanetRing.AngleDegreesY; m_ringAngleXSlider.Value = m_selectedPlanet.PlanetRing.AngleDegreesX; m_ringRoidSizeSlider.Value = m_selectedPlanet.PlanetRing.RoidSize; m_ringRoidSizeMaxSlider.Value = m_selectedPlanet.PlanetRing.RoidSizeMax; } else { m_ringWidthSlider.Value = m_ringWidthSlider.DefaultValue.Value; m_ringAngleXSlider.Value = m_ringAngleXSlider.DefaultValue.Value; m_ringAngleYSlider.Value = m_ringAngleXSlider.DefaultValue.Value; m_ringAngleZSlider.Value = m_ringAngleXSlider.DefaultValue.Value; m_ringRoidSizeSlider.Value = m_ringRoidSizeSlider.MinValue; m_ringRoidSizeMaxSlider.Value = m_ringRoidSizeMaxSlider.MaxValue; m_ringRoidSizeSlider.Value = m_ringRoidSizeSlider.DefaultValue.Value; m_ringRoidSizeMaxSlider.Value = m_ringRoidSizeMaxSlider.DefaultValue.Value; } m_ringRoidSizeValue.Text = m_ringRoidSizeSlider.Value.ToString(); m_ringAngleXValue.Text = String.Format("{0:0.00}", m_ringAngleXSlider.Value); m_ringAngleYValue.Text = String.Format("{0:0.00}", m_ringAngleYSlider.Value); m_ringAngleZValue.Text = String.Format("{0:0.00}", m_ringAngleZSlider.Value); m_ringWidthValue.Text = m_ringWidthSlider.Value.ToString(); m_ringDistanceValue.Text = m_ringDistanceSlider.Value.ToString(); UpdateRingVisual(); } }
/// <summary> /// Adds a planet to the system on the server. /// </summary> /// <param name="planet">Planet to add</param> public void AddPlanet(MyPlanetItem planet, Action <bool> callback = null) { m_addActionsCallbacks.Add(++m_currentAddIndex, callback); PluginEventHandler.Static.RaiseStaticEvent(SendAddPlanet, planet, m_currentAddIndex, Sync.MyId, null); }
static void SendGetPlanetClient(bool success, MyPlanetItem item, ulong callback) { Static.m_getActionCallbacks[callback](success, item); Static.m_getActionCallbacks.Remove(callback); }