void Ship::SetFlightState(Ship::FlightState newState) { if (m_flightState == newState) return; if (IsHyperspaceActive() && (newState != FLYING)) AbortHyperjump(); if (newState == FLYING) { m_testLanded = false; if (m_flightState == DOCKING || m_flightState == DOCKED) onUndock.emit(); m_dockedWith = nullptr; // lock thrusters on for amount of time needed to push us out of station static const double MASS_LOCK_REFERENCE(40000.0); // based purely on experimentation // limit the time to between 2.0 and 20.0 seconds of thrust, the player can override m_launchLockTimeout = std::min(std::max(2.0, 2.0 * (GetMass() / MASS_LOCK_REFERENCE)), 20.0); } m_flightState = newState; Properties().Set("flightState", EnumStrings::GetString("ShipFlightState", m_flightState)); switch (m_flightState) { case FLYING: SetMoving(true); SetColliding(true); SetStatic(false); break; case DOCKING: SetMoving(false); SetColliding(false); SetStatic(false); break; case UNDOCKING: SetMoving(false); SetColliding(false); SetStatic(false); break; // TODO: set collision index? dynamic stations... use landed for open-air? case DOCKED: SetMoving(false); SetColliding(false); SetStatic(false); break; case LANDED: SetMoving(false); SetColliding(true); SetStatic(true); break; case JUMPING: SetMoving(true); SetColliding(false); SetStatic(false); break; case HYPERSPACE: SetMoving(false); SetColliding(false); SetStatic(false); break; } }
void Ship::SetFlightState(Ship::FlightState newState) { if (m_flightState == newState) return; if (IsHyperspaceActive() && (newState != FLYING)) ResetHyperspaceCountdown(); if (newState == FLYING) { m_testLanded = false; if (m_flightState == DOCKING || m_flightState == DOCKED) onUndock.emit(); m_dockedWith = 0; // lock thrusters for two seconds to push us out of station m_launchLockTimeout = 2.0; } m_flightState = newState; switch (m_flightState) { case FLYING: SetMoving(true); SetColliding(true); SetStatic(false); break; case DOCKING: SetMoving(false); SetColliding(false); SetStatic(false); break; // TODO: set collision index? dynamic stations... use landed for open-air? case DOCKED: SetMoving(false); SetColliding(false); SetStatic(false); break; case LANDED: SetMoving(false); SetColliding(true); SetStatic(true); break; case HYPERSPACE: SetMoving(false); SetColliding(false); SetStatic(false); break; } }