void SetOrbitHere(Entity entity, PositionDB positionDB, WarpMovingDB moveDB, DateTime atDateTime) { //propulsionDB.CurrentVectorMS = new Vector3(0, 0, 0); double targetSOI = OrbitProcessor.GetSOI_m(moveDB.TargetEntity); Entity targetEntity; if (moveDB.TargetEntity.GetDataBlob <PositionDB>().GetDistanceTo_m(positionDB) > targetSOI) { targetEntity = moveDB.TargetEntity.GetDataBlob <OrbitDB>().Parent; //TODO: it's concevable we could be in another SOI not the parent (ie we could be in a target's moon's SOI) } else { targetEntity = moveDB.TargetEntity; } OrbitDB targetOrbit = targetEntity.GetDataBlob <OrbitDB>(); Vector3 insertionVector_m = OrbitProcessor.GetOrbitalInsertionVector_m(moveDB.SavedNewtonionVector, targetOrbit, atDateTime); positionDB.SetParent(targetEntity); if (moveDB.ExpendDeltaV.Length() != 0) { NewtonThrustCommand.CreateCommand(entity.FactionOwner, entity, entity.StarSysDateTime, moveDB.ExpendDeltaV); entity.RemoveDataBlob <WarpMovingDB>(); moveDB.IsAtTarget = true; } else { OrbitDB newOrbit = OrbitDB.FromVelocity_m(targetEntity, entity, insertionVector_m, atDateTime); entity.RemoveDataBlob <WarpMovingDB>(); if (newOrbit.Apoapsis < targetSOI) //furtherst point within soi, normal orbit { entity.SetDataBlob(newOrbit); } else if (newOrbit.Periapsis > targetSOI) //closest point outside soi { //find who's SOI we are in, and create an orbit around that. targetEntity = OrbitProcessor.FindSOIForPosition((StarSystem)entity.Manager, positionDB.AbsolutePosition_m); newOrbit = OrbitDB.FromVelocity_m(targetEntity, entity, insertionVector_m, atDateTime); entity.SetDataBlob(newOrbit); } else //closest point inside soi, but furtherest point outside. make a newtonion trajectory. { var newtmove = new NewtonMoveDB(targetEntity, insertionVector_m); entity.SetDataBlob(newtmove); } positionDB.SetParent(targetEntity); moveDB.IsAtTarget = true; } }
public static void CreateCommand(Guid faction, Entity orderEntity, DateTime actionDateTime, Vector3 expendDeltaV_m) { var cmd = new NewtonThrustCommand() { RequestingFactionGuid = faction, EntityCommandingGuid = orderEntity.Guid, CreatedDate = orderEntity.Manager.ManagerSubpulses.StarSysDateTime, _orbitRalitiveDeltaV = expendDeltaV_m, ActionOnDate = actionDateTime }; StaticRefLib.Game.OrderHandler.HandleOrder(cmd); }
public static void CreateCommand(Guid faction, Entity orderEntity, DateTime actionDateTime, Vector3 expendDeltaV_m) { var cmd = new NewtonThrustCommand() { RequestingFactionGuid = faction, EntityCommandingGuid = orderEntity.Guid, CreatedDate = orderEntity.Manager.ManagerSubpulses.StarSysDateTime, }; var parent = Entity.GetSOIParentEntity(orderEntity); var currentVel = Entity.GetVelocity_m(orderEntity, actionDateTime); cmd._db = new NewtonMoveDB(parent, currentVel); cmd._db.ActionOnDateTime = actionDateTime; cmd._db.DeltaVForManuver_m = expendDeltaV_m; StaticRefLib.Game.OrderHandler.HandleOrder(cmd); }