Unverified Commit 760e95ac authored by Don Gagne's avatar Don Gagne Committed by GitHub

Merge pull request #8049 from DonLakeFlyer/TakeoffItem

PLan: Takeoff item user model changes
parents d9dba43c fc2781c3
......@@ -17,8 +17,6 @@ import QGroundControl.Palette 1.0
/// The MissionLineView control is used to add lines between mission items
MapItemView {
property bool homePositionValid: true ///< true: show home position, false: don't show home position
delegate: MapPolyline {
line.width: 3
line.color: "#be781c" // Hack, can't get palette to work in here
......
......@@ -377,7 +377,7 @@ VisualMissionItem* MissionController::_insertSimpleMissionItemWorker(QGeoCoordin
}
// We send the click coordinate through here to be able to set the planned home position from the user click location if needed
_recalcAllWithClickCoordinate(coordinate);
_recalcAllWithCoordinate(coordinate);
if (makeCurrentItem) {
setCurrentPlanViewIndex(newItem->sequenceNumber(), true);
......@@ -392,15 +392,11 @@ VisualMissionItem* MissionController::insertSimpleMissionItem(QGeoCoordinate coo
return _insertSimpleMissionItemWorker(coordinate, MAV_CMD_NAV_WAYPOINT, visualItemIndex, makeCurrentItem);
}
VisualMissionItem* MissionController::insertTakeoffItem(QGeoCoordinate coordinate, int visualItemIndex, bool makeCurrentItem)
VisualMissionItem* MissionController::insertTakeoffItem(QGeoCoordinate /*coordinate*/, int visualItemIndex, bool makeCurrentItem)
{
int sequenceNumber = _nextSequenceNumber();
TakeoffMissionItem * newItem = new TakeoffMissionItem(_controllerVehicle->vtol() ? MAV_CMD_NAV_VTOL_TAKEOFF : MAV_CMD_NAV_TAKEOFF, _controllerVehicle, _flyView, _settingsItem, this);
TakeoffMissionItem * newItem = new TakeoffMissionItem(_controllerVehicle->vtol() ? MAV_CMD_NAV_VTOL_TAKEOFF : MAV_CMD_NAV_TAKEOFF, _managerVehicle, _flyView, _settingsItem, this);
newItem->setSequenceNumber(sequenceNumber);
if (!newItem->coordinate().isValid()) {
newItem->setCoordinate(coordinate);
}
newItem->setWizardMode(true);
_initVisualItem(newItem);
if (newItem->specifiesAltitude()) {
......@@ -419,8 +415,7 @@ VisualMissionItem* MissionController::insertTakeoffItem(QGeoCoordinate coordinat
_visualItems->insert(visualItemIndex, newItem);
}
// We send the click coordinate through here to be able to set the planned home position from the user click location if needed
_recalcAllWithClickCoordinate(coordinate);
_recalcAll();
if (makeCurrentItem) {
setCurrentPlanViewIndex(newItem->sequenceNumber(), true);
......@@ -466,7 +461,7 @@ VisualMissionItem* MissionController::insertComplexMissionItem(QString itemName,
return nullptr;
}
_insertComplexMissionItemWorker(newItem, visualItemIndex, makeCurrentItem);
_insertComplexMissionItemWorker(mapCenterCoordinate, newItem, visualItemIndex, makeCurrentItem);
return newItem;
}
......@@ -486,12 +481,12 @@ VisualMissionItem* MissionController::insertComplexMissionItemFromKMLOrSHP(QStri
return nullptr;
}
_insertComplexMissionItemWorker(newItem, visualItemIndex, makeCurrentItem);
_insertComplexMissionItemWorker(QGeoCoordinate(), newItem, visualItemIndex, makeCurrentItem);
return newItem;
}
void MissionController::_insertComplexMissionItemWorker(ComplexMissionItem* complexItem, int visualItemIndex, bool makeCurrentItem)
void MissionController::_insertComplexMissionItemWorker(const QGeoCoordinate& mapCenterCoordinate, ComplexMissionItem* complexItem, int visualItemIndex, bool makeCurrentItem)
{
int sequenceNumber = _nextSequenceNumber();
bool surveyStyleItem = qobject_cast<SurveyComplexItem*>(complexItem) ||
......@@ -538,7 +533,7 @@ void MissionController::_insertComplexMissionItemWorker(ComplexMissionItem* comp
if(!complexItem->isSimpleItem()) {
connect(complexItem, &ComplexMissionItem::boundingCubeChanged, this, &MissionController::_complexBoundingBoxChanged);
}
_recalcAll();
_recalcAllWithCoordinate(mapCenterCoordinate);
if (makeCurrentItem) {
setCurrentPlanViewIndex(complexItem->sequenceNumber(), true);
......@@ -1649,6 +1644,7 @@ void MissionController::_recalcChildItems(void)
void MissionController::_setPlannedHomePositionFromFirstCoordinate(const QGeoCoordinate& clickCoordinate)
{
bool foundFirstCoordinate = false;
QGeoCoordinate firstCoordinate;
if (_settingsItem->coordinate().isValid()) {
......@@ -1659,14 +1655,15 @@ void MissionController::_setPlannedHomePositionFromFirstCoordinate(const QGeoCoo
for (int i=1; i<_visualItems->count(); i++) {
VisualMissionItem* item = _visualItems->value<VisualMissionItem*>(i);
if (item->specifiesCoordinate()) {
if (item->specifiesCoordinate() && item->coordinate().isValid()) {
foundFirstCoordinate = true;
firstCoordinate = item->coordinate();
break;
}
}
// No item specifying a coordinate was found, in this case it we have a clickCoordinate use that
if (!firstCoordinate.isValid()) {
if (!foundFirstCoordinate) {
firstCoordinate = clickCoordinate;
}
......@@ -1677,11 +1674,10 @@ void MissionController::_setPlannedHomePositionFromFirstCoordinate(const QGeoCoo
}
}
/// @param clickCoordinate The location of the user click when inserting a new item
void MissionController::_recalcAllWithClickCoordinate(QGeoCoordinate& clickCoordinate)
void MissionController::_recalcAllWithCoordinate(const QGeoCoordinate& coordinate)
{
if (!_flyView) {
_setPlannedHomePositionFromFirstCoordinate(clickCoordinate);
_setPlannedHomePositionFromFirstCoordinate(coordinate);
}
_recalcSequence();
_recalcChildItems();
......@@ -1692,7 +1688,7 @@ void MissionController::_recalcAllWithClickCoordinate(QGeoCoordinate& clickCoord
void MissionController::_recalcAll(void)
{
QGeoCoordinate emptyCoord;
_recalcAllWithClickCoordinate(emptyCoord);
_recalcAllWithCoordinate(emptyCoord);
}
/// Initializes a new set of mission items
......@@ -1708,8 +1704,6 @@ void MissionController::_initAllVisualItems(void)
}
}
_settingsItem->setHomePositionFromVehicle(_managerVehicle);
connect(_settingsItem, &MissionSettingsItem::coordinateChanged, this, &MissionController::_recalcAll);
connect(_settingsItem, &MissionSettingsItem::coordinateChanged, this, &MissionController::plannedHomePositionChanged);
......@@ -1817,39 +1811,14 @@ void MissionController::managerVehicleChanged(Vehicle* managerVehicle)
connect(_missionManager, &MissionManager::lastCurrentIndexChanged, this, &MissionController::resumeMissionIndexChanged);
connect(_missionManager, &MissionManager::resumeMissionReady, this, &MissionController::resumeMissionReady);
connect(_missionManager, &MissionManager::resumeMissionUploadFail, this, &MissionController::resumeMissionUploadFail);
connect(_managerVehicle, &Vehicle::homePositionChanged, this, &MissionController::_managerVehicleHomePositionChanged);
connect(_managerVehicle, &Vehicle::defaultCruiseSpeedChanged, this, &MissionController::_recalcMissionFlightStatus);
connect(_managerVehicle, &Vehicle::defaultHoverSpeedChanged, this, &MissionController::_recalcMissionFlightStatus);
connect(_managerVehicle, &Vehicle::vehicleTypeChanged, this, &MissionController::complexMissionItemNamesChanged);
if (!_masterController->offline()) {
_managerVehicleHomePositionChanged();
}
emit complexMissionItemNamesChanged();
emit resumeMissionIndexChanged();
}
void MissionController::_managerVehicleHomePositionChanged(void)
{
if (_visualItems) {
bool currentDirtyBit = dirty();
MissionSettingsItem* settingsItem = qobject_cast<MissionSettingsItem*>(_visualItems->get(0));
if (settingsItem) {
settingsItem->setHomePositionFromVehicle(_managerVehicle);
} else {
qWarning() << "First item is not MissionSettingsItem";
}
if (!currentDirtyBit) {
// Don't let this trip the dirty bit. Otherwise plan will keep getting marked dirty if vehicle home
// changes.
_visualItems->setDirty(false);
}
}
}
void MissionController::_inProgressChanged(bool inProgress)
{
emit syncInProgressChanged(inProgress);
......@@ -1858,8 +1827,8 @@ void MissionController::_inProgressChanged(bool inProgress)
bool MissionController::_findPreviousAltitude(int newIndex, double* prevAltitude, int* prevAltitudeMode)
{
bool found = false;
double foundAltitude;
int foundAltitudeMode;
double foundAltitude = 0;
int foundAltitudeMode = QGroundControlQmlGlobal::AltitudeModeNone;
if (newIndex > _visualItems->count()) {
return false;
......@@ -1907,9 +1876,8 @@ MissionSettingsItem* MissionController::_addMissionSettings(QmlObjectListModel*
{
qCDebug(MissionControllerLog) << "_addMissionSettings";
MissionSettingsItem* settingsItem = new MissionSettingsItem(_controllerVehicle, _flyView, visualItems);
MissionSettingsItem* settingsItem = new MissionSettingsItem(_managerVehicle, _flyView, visualItems);
visualItems->insert(0, settingsItem);
settingsItem->setHomePositionFromVehicle(_managerVehicle);
if (visualItems == _visualItems) {
_settingsItem = settingsItem;
......
......@@ -260,7 +260,6 @@ signals:
private slots:
void _newMissionItemsAvailableFromVehicle(bool removeAllRequested);
void _itemCommandChanged(void);
void _managerVehicleHomePositionChanged(void);
void _inProgressChanged(bool inProgress);
void _currentMissionIndexChanged(int sequenceNumber);
void _recalcWaypointLines(void);
......@@ -278,7 +277,7 @@ private:
void _init(void);
void _recalcSequence(void);
void _recalcChildItems(void);
void _recalcAllWithClickCoordinate(QGeoCoordinate& clickCoordinate);
void _recalcAllWithCoordinate(const QGeoCoordinate& coordinate);
void _initAllVisualItems(void);
void _deinitAllVisualItems(void);
void _initVisualItem(VisualMissionItem* item);
......@@ -308,7 +307,7 @@ private:
CoordinateVector* _addWaypointLineSegment(CoordVectHashTable& prevItemPairHashTable, VisualItemPair& pair);
void _addTimeDistance(bool vtolInHover, double hoverTime, double cruiseTime, double extraTime, double distance, int seqNum);
VisualMissionItem* _insertSimpleMissionItemWorker(QGeoCoordinate coordinate, MAV_CMD command, int visualItemIndex, bool makeCurrentItem);
void _insertComplexMissionItemWorker(ComplexMissionItem* complexItem, int visualItemIndex, bool makeCurrentItem);
void _insertComplexMissionItemWorker(const QGeoCoordinate& mapCenterCoordinate, ComplexMissionItem* complexItem, int visualItemIndex, bool makeCurrentItem);
void _warnIfTerrainFrameUsed(void);
private:
......
......@@ -47,17 +47,16 @@ MissionSettingsItem::MissionSettingsItem(Vehicle* vehicle, bool flyView, QObject
connect(this, &MissionSettingsItem::specifyMissionFlightSpeedChanged, this, &MissionSettingsItem::_setDirtyAndUpdateLastSequenceNumber);
connect(&_cameraSection, &CameraSection::itemCountChanged, this, &MissionSettingsItem::_setDirtyAndUpdateLastSequenceNumber);
connect(&_speedSection, &CameraSection::itemCountChanged, this, &MissionSettingsItem::_setDirtyAndUpdateLastSequenceNumber);
connect(this, &MissionSettingsItem::terrainAltitudeChanged, this, &MissionSettingsItem::_setHomeAltFromTerrain);
connect(&_cameraSection, &CameraSection::dirtyChanged, this, &MissionSettingsItem::_sectionDirtyChanged);
connect(&_speedSection, &SpeedSection::dirtyChanged, this, &MissionSettingsItem::_sectionDirtyChanged);
connect(&_cameraSection, &CameraSection::specifiedGimbalYawChanged, this, &MissionSettingsItem::specifiedGimbalYawChanged);
connect(&_cameraSection, &CameraSection::specifiedGimbalPitchChanged, this, &MissionSettingsItem::specifiedGimbalPitchChanged);
connect(&_speedSection, &SpeedSection::specifiedFlightSpeedChanged, this, &MissionSettingsItem::specifiedFlightSpeedChanged);
connect(_vehicle, &Vehicle::homePositionChanged, this, &MissionSettingsItem::_updateHomePosition);
connect(&_plannedHomePositionAltitudeFact, &Fact::rawValueChanged, this, &MissionSettingsItem::_updateAltitudeInCoordinate);
connect(&_cameraSection, &CameraSection::dirtyChanged, this, &MissionSettingsItem::_sectionDirtyChanged);
connect(&_speedSection, &SpeedSection::dirtyChanged, this, &MissionSettingsItem::_sectionDirtyChanged);
connect(&_cameraSection, &CameraSection::specifiedGimbalYawChanged, this, &MissionSettingsItem::specifiedGimbalYawChanged);
connect(&_cameraSection, &CameraSection::specifiedGimbalPitchChanged, this, &MissionSettingsItem::specifiedGimbalPitchChanged);
connect(&_speedSection, &SpeedSection::specifiedFlightSpeedChanged, this, &MissionSettingsItem::specifiedFlightSpeedChanged);
_updateHomePosition(_vehicle->homePosition());
}
int MissionSettingsItem::lastSequenceNumber(void) const
......@@ -285,3 +284,10 @@ QString MissionSettingsItem::abbreviation(void) const
{
return _flyView ? tr("H") : tr("Launch");
}
void MissionSettingsItem::_updateHomePosition(const QGeoCoordinate& homePosition)
{
if (_flyView) {
setCoordinate(homePosition);
}
}
......@@ -100,6 +100,7 @@ private slots:
void _updateAltitudeInCoordinate (QVariant value);
void _setHomeAltFromTerrain (double terrainAltitude);
void _setCoordinateWorker (const QGeoCoordinate& coordinate);
void _updateHomePosition (const QGeoCoordinate& homePosition);
private:
QGeoCoordinate _plannedHomePositionCoordinate; // Does not include altitude
......
......@@ -50,15 +50,21 @@ void TakeoffMissionItem::_init(void)
{
_editorQml = QStringLiteral("qrc:/qml/SimpleItemEditor.qml");
if (_settingsItem->coordinate().isValid()) {
// Either the user has set a Launch location or it came from a connected vehicle.
// Use it as starting point.
setCoordinate(_settingsItem->coordinate());
QGeoCoordinate homePosition = _vehicle->homePosition();
if (homePosition.isValid()) {
_settingsItem->setCoordinate(homePosition);
}
connect(_settingsItem, &MissionSettingsItem::coordinateChanged, this, &TakeoffMissionItem::launchCoordinateChanged);
_initLaunchTakeoffAtSameLocation();
if (_launchTakeoffAtSameLocation && homePosition.isValid()) {
_wizardMode = false;
SimpleMissionItem::setCoordinate(homePosition);
} else {
_wizardMode = true;
}
setDirty(false);
}
......@@ -76,19 +82,11 @@ void TakeoffMissionItem::setLaunchTakeoffAtSameLocation(bool launchTakeoffAtSame
void TakeoffMissionItem::setCoordinate(const QGeoCoordinate& coordinate)
{
if (this->coordinate().isValid() || !_vehicle->fixedWing()) {
if (coordinate != this->coordinate()) {
if (_launchTakeoffAtSameLocation) {
setLaunchCoordinate(coordinate);
}
SimpleMissionItem::setCoordinate(coordinate);
}
} else {
// First time setup for fixed wing
if (!launchCoordinate().isValid()) {
setLaunchCoordinate(coordinate);
if (coordinate != this->coordinate()) {
SimpleMissionItem::setCoordinate(coordinate);
if (_launchTakeoffAtSameLocation) {
_settingsItem->setCoordinate(coordinate);
}
SimpleMissionItem::setCoordinate(launchCoordinate().atDistanceAndAzimuth(60, 0));
}
}
......@@ -99,10 +97,22 @@ bool TakeoffMissionItem::isTakeoffCommand(MAV_CMD command)
void TakeoffMissionItem::_initLaunchTakeoffAtSameLocation(void)
{
if (_vehicle->fixedWing()) {
setLaunchTakeoffAtSameLocation(!specifiesCoordinate());
if (specifiesCoordinate()) {
if (_vehicle->fixedWing()) {
setLaunchTakeoffAtSameLocation(false);
} else {
// PX4 specifies a coordinate for takeoff even for non fixed wing. But it makes more sense to not have a coordinate
// from and end user standpoint. So even for PX4 we try to keep launch and takeoff at the same position. Unless the
// user has moved/loaded launch at a different location than takeoff.
if (coordinate().isValid() && _settingsItem->coordinate().isValid()) {
setLaunchTakeoffAtSameLocation(coordinate().latitude() == _settingsItem->coordinate().latitude() && coordinate().longitude() == _settingsItem->coordinate().longitude());
} else {
setLaunchTakeoffAtSameLocation(true);
}
}
} else {
setLaunchTakeoffAtSameLocation(coordinate().latitude() == _settingsItem->coordinate().latitude() && coordinate().longitude() == _settingsItem->coordinate().longitude());
setLaunchTakeoffAtSameLocation(true);
}
}
......@@ -123,3 +133,33 @@ bool TakeoffMissionItem::load(const QJsonObject& json, int sequenceNumber, QStri
}
return success;
}
void TakeoffMissionItem::setLaunchCoordinate(const QGeoCoordinate& launchCoordinate)
{
if (!launchCoordinate.isValid()) {
return;
}
_settingsItem->setCoordinate(launchCoordinate);
if (!coordinate().isValid()) {
QGeoCoordinate takeoffCoordinate;
if (_launchTakeoffAtSameLocation) {
takeoffCoordinate = launchCoordinate;
} else {
double altitude = this->altitude()->rawValue().toDouble();
double distance = 0.0;
if (coordinateHasRelativeAltitude()) {
// Offset for fixed wing climb out of 30 degrees
if (altitude != 0.0) {
distance = altitude / tan(qDegreesToRadians(30.0));
}
} else {
distance = altitude * 1.5;
}
takeoffCoordinate = launchCoordinate.atDistanceAndAzimuth(distance, 0);
}
SimpleMissionItem::setCoordinate(takeoffCoordinate);
}
}
......@@ -29,7 +29,7 @@ public:
QGeoCoordinate launchCoordinate (void) const { return _settingsItem->coordinate(); }
bool launchTakeoffAtSameLocation (void) const { return _launchTakeoffAtSameLocation; }
void setLaunchCoordinate (const QGeoCoordinate& launchCoordinate) { _settingsItem->setCoordinate(launchCoordinate); }
void setLaunchCoordinate (const QGeoCoordinate& launchCoordinate);
void setLaunchTakeoffAtSameLocation (bool launchTakeoffAtSameLocation);
static bool isTakeoffCommand(MAV_CMD command);
......
......@@ -179,6 +179,8 @@ Item {
anchors.fill: map
z: QGroundControl.zOrderMapItems + 1 // Over item indicators
readonly property int _decimalPlaces: 8
onClicked: {
var coordinate = map.toCoordinate(Qt.point(mouse.x, mouse.y), false /* clipToViewPort */)
coordinate.latitude = coordinate.latitude.toFixed(_decimalPlaces)
......
......@@ -38,8 +38,7 @@ Item {
property real _rowSpacing: ScreenTools.isMobile ? 1 : 0
property real _distance: _statusValid && _currentMissionItem ? _currentMissionItem.distance : NaN
property real _altDifference: _statusValid && _currentMissionItem ? _currentMissionItem.altDifference : NaN
property real _gradient: _statusValid && _currentMissionItem && _currentMissionItem.distance > 0 ? Math.atan(_currentMissionItem.altDifference / _currentMissionItem.distance) : NaN
property real _gradientPercent: isNaN(_gradient) ? NaN : _gradient * 100
property real _gradient: _statusValid && _currentMissionItem && _currentMissionItem.distance > 0 ? (Math.atan(_currentMissionItem.altDifference / _currentMissionItem.distance) * (180.0/Math.PI)) : NaN
property real _azimuth: _statusValid && _currentMissionItem ? _currentMissionItem.azimuth : NaN
property real _heading: _statusValid && _currentMissionItem ? _currentMissionItem.missionVehicleYaw : NaN
property real _missionDistance: _missionValid ? missionDistance : NaN
......@@ -53,7 +52,7 @@ Item {
property string _distanceText: isNaN(_distance) ? "-.-" : QGroundControl.metersToAppSettingsDistanceUnits(_distance).toFixed(1) + " " + QGroundControl.appSettingsDistanceUnitsString
property string _altDifferenceText: isNaN(_altDifference) ? "-.-" : QGroundControl.metersToAppSettingsDistanceUnits(_altDifference).toFixed(1) + " " + QGroundControl.appSettingsDistanceUnitsString
property string _gradientText: isNaN(_gradient) ? "-.-" : _gradientPercent.toFixed(0) + " %"
property string _gradientText: isNaN(_gradient) ? "-.-" : _gradient.toFixed(0) + " %"
property string _azimuthText: isNaN(_azimuth) ? "-.-" : Math.round(_azimuth) % 360
property string _headingText: isNaN(_azimuth) ? "-.-" : Math.round(_heading) % 360
property string _missionDistanceText: isNaN(_missionDistance) ? "-.-" : QGroundControl.metersToAppSettingsDistanceUnits(_missionDistance).toFixed(0) + " " + QGroundControl.appSettingsDistanceUnitsString
......
......@@ -63,24 +63,29 @@ Rectangle {
anchors.left: parent.left
anchors.right: parent.right
spacing: _margin
visible: missionItem.wizardMode
visible: missionItem.isTakeoffItem && missionItem.wizardMode // Hack special case for takeoff item
QGCLabel {
text: qsTr("Adjust the initial launch location by dragging 'L' indicator to the desired location.")
id: initialClickLabel
text: missionItem.launchTakeoffAtSameLocation ?
qsTr("Click in map to set Takeoff location.") :
qsTr("Click in map to set Launch location.")
Layout.fillWidth: true
wrapMode: Text.WordWrap
visible: !missionItem.launchTakeoffAtSameLocation
visible: missionItem.isTakeoffItem && !missionItem.launchCoordinate.isValid
}
QGCLabel {
text: qsTr("Adjust the takeoff %1 location by dragging 'T' indicator to the desired location.").arg(missionItem.launchTakeoffAtSameLocation ? "" : qsTr("completion "))
text: qsTr("Adjust the takeoff completion location by dragging 'T' indicator to the desired location.")
Layout.fillWidth: true
wrapMode: Text.WordWrap
visible: !initialClickLabel.visible
}
QGCButton {
text: qsTr("Done Adjusting")
Layout.fillWidth: true
visible: !initialClickLabel.visible
onClicked: {
missionItem.wizardMode = false
editorRoot.selectNextNotReadyItem()
......
......@@ -46,12 +46,16 @@ Item {
QGCDynamicObjectManager { id: _objMgrCommonVisuals }
QGCDynamicObjectManager { id: _objMgrEditingVisuals }
QGCDynamicObjectManager { id: _objMgrMouseClick }
Component.onCompleted: {
addCommonVisuals()
if (_missionItem.isCurrentItem && map.planView) {
addEditingVisuals()
}
if (!_missionItem.launchCoordinate.isValid) {
_objMgrMouseClick.createObject(mouseAreaClickComponent, map, false /* addToMap */)
}
}
Connections {
......@@ -127,4 +131,28 @@ Item {
}
}
}
// Mouse area to capture launch location click
Component {
id: mouseAreaClickComponent
MouseArea {
anchors.fill: map
z: QGroundControl.zOrderMapItems + 1 // Over item indicators
readonly property int _decimalPlaces: 8
onClicked: {
var coordinate = map.toCoordinate(Qt.point(mouse.x, mouse.y), false /* clipToViewPort */)
coordinate.latitude = coordinate.latitude.toFixed(_decimalPlaces)
coordinate.longitude = coordinate.longitude.toFixed(_decimalPlaces)
coordinate.altitude = coordinate.altitude.toFixed(_decimalPlaces)
_missionItem.launchCoordinate = coordinate
if (_missionItem.launchTakeoffAtSameLocation) {
_missionItem.wizardMode = false
}
_objMgrMouseClick.destroyObjects()
}
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment