private void SpawnBotType(string subTypeName, MatrixD viewMatrix) { if (MyDefinitionManager.Static.GetBotDefinitions().Any(e => e.Id.SubtypeName.Equals(subTypeName, StringComparison.InvariantCultureIgnoreCase))) { var currentPlanetList = new List <IMyVoxelBase>(); MyAPIGateway.Session.VoxelMaps.GetInstances(currentPlanetList, v => v is MyPlanet); bool canSpawn = false; foreach (IMyVoxelBase planet in currentPlanetList) { MyGravityProviderComponent gravityProvider = planet.Components.Get <MyGravityProviderComponent>(); canSpawn |= gravityProvider.IsPositionInRange(viewMatrix.Translation); } if (canSpawn) { Sandbox.Game.MyVisualScriptLogicProvider.SpawnBot(subTypeName, viewMatrix.Translation); MyAPIGateway.Utilities.SendMessage(SenderSteamId, "server", "Spawned {0}", subTypeName); } else { MyAPIGateway.Utilities.SendMessage(SenderSteamId, "server", "Cannot spawn here. Requires natural gravity."); } } }
private float PlanetaryInfluence() { BoundingBoxD box = _thisEntity.PositionComp.WorldAABB; MyPlanet closestPlanet = MyGamePruningStructure.GetClosestPlanet(ref box); if (closestPlanet == null) { return(0); } MyGravityProviderComponent myGravityProviderComponent = closestPlanet.Components.Get <MyGravityProviderComponent>(); return(closestPlanet.GetAirDensity(box.Center) * myGravityProviderComponent.GetGravityMultiplier(box.Center)); }
public static float CalculateRequiredLift(MyCubeBlock block) { BoundingBoxD box = block.PositionComp.WorldAABB; MyPlanet closestPlanet = MyGamePruningStructure.GetClosestPlanet(ref box); if (closestPlanet == null) { return(0); } MyGravityProviderComponent myGravityProviderComponent = closestPlanet.Components.Get <MyGravityProviderComponent>(); MatrixD worldMatrixRef = block.PositionComp.WorldMatrixRef; return(block.CubeGrid.Mass * myGravityProviderComponent.GetGravityMultiplier(worldMatrixRef.Translation) * GravityConstant); }
public static float PlanetaryInfluence(IMyEntity block) { BoundingBoxD box = block.PositionComp.WorldAABB; MyPlanet closestPlanet = MyGamePruningStructure.GetClosestPlanet(ref box); if (closestPlanet == null) { return(0); } MyGravityProviderComponent myGravityProviderComponent = closestPlanet.Components.Get <MyGravityProviderComponent>(); return(closestPlanet.GetAirDensity(box.Center) * myGravityProviderComponent.GetGravityMultiplier(box.Center)); //MySimpleObjectDraw //billboa }
bool IsInGravity() { Vector3D position = grid.MainGrid.PositionComp.GetPosition(); MyPlanet planet = MyGamePruningStructure.GetClosestPlanet(position); if (planet == null) { return(false); } MyGravityProviderComponent gravComp = planet.Components.Get <MyGravityProviderComponent>(); if (gravComp == null) { return(false); } return(gravComp.GetGravityMultiplier(position) > 0); }
public override void UpdateBeforeSimulation() { if (MyAPIGateway.Session == null) { return; } if (MyAPIGateway.Utilities.IsDedicated) { return; } if (!m_initialize) { Initialize(); } if (nearEffects.Count + farEffects.Count > 0) { IMyCamera cam = MyAPIGateway.Session.Camera; Vector3D pos = cam.Position; Vector3D vel = (pos - lastCamPos) / (DateTime.Now - lastCamTime).TotalSeconds; Vector3D camForward = cam.WorldMatrix.Forward; Vector3D camLeft = cam.WorldMatrix.Left; Vector3D camUp = cam.WorldMatrix.Up; lastCamTime = DateTime.Now; lastCamPos = pos; pos += vel; Vector3D grav = new Vector3D(0); { var planets = new List <IMyVoxelBase>(); MyAPIGateway.Session.VoxelMaps.GetInstances(planets, v => v is MyPlanet); foreach (IMyVoxelBase planet in planets) { MyGravityProviderComponent gravC = planet.Components.Get <MyGravityProviderComponent>(); if (gravC != null) { grav += gravC.GetWorldGravity(pos); } } } Vector3D up = -grav; up.Normalize(); Vector3D forward = Vector3D.Cross(Vector3D.Cross(up, camForward), up); forward.Normalize(); Random r = new Random(); double tanFOV = Math.Tan(Math.PI * cam.FieldOfViewAngle / 360.0); foreach (MyParticleEffect effect in nearEffects) { double dist = (2 * r.NextDouble() - 1) * 10; double theta = r.NextDouble() * Math.PI * 2; double lrField = Math.Abs(tanFOV * dist) + 5; Vector3D refPos = pos + (camForward * Math.Cos(theta) * dist) + (camLeft * dist * Math.Sin(theta)) + (lrField * camUp * (r.NextDouble() * 2 - 1)); effect.WorldMatrix = MatrixD.CreateWorld(refPos, forward, up); } foreach (MyParticleEffect effect in farEffects) { double dist = 10 + r.NextDouble() * 50; double lrMod = (r.NextDouble() * 2) - 1; double lrField = Math.Abs(tanFOV * dist); Vector3D refPos = pos + (camForward * dist) + (lrMod * lrField * camLeft) + (lrField * camUp * (r.NextDouble() * 2 - 1)); effect.WorldMatrix = MatrixD.CreateWorld(refPos, forward, up); } } //Logging.Instance.Log("Did a thing"); }