diff --git a/server/src/train/train.cpp b/server/src/train/train.cpp index f8b1aa33..b96568b1 100644 --- a/server/src/train/train.cpp +++ b/server/src/train/train.cpp @@ -244,6 +244,7 @@ void Train::destroying() for(const auto& item : *vehicles) { item->vehicle->trains.removeInternal(self); + item->destroy(); } m_world.trains->removeObject(self); IdObject::destroying(); diff --git a/server/src/train/trainvehiclelistitem.cpp b/server/src/train/trainvehiclelistitem.cpp index 56a3b23e..f8ee7a10 100644 --- a/server/src/train/trainvehiclelistitem.cpp +++ b/server/src/train/trainvehiclelistitem.cpp @@ -38,7 +38,7 @@ TrainVehicleListItem::TrainVehicleListItem(const std::shared_ptr &v return false; //Vehicle already in train if(vehicle) - disconnectVehicle(*vehicle); + disconnectVehicle(); if(value) connectVehicle(*value); @@ -68,9 +68,7 @@ std::string TrainVehicleListItem::getObjectId() const void TrainVehicleListItem::destroying() { //NOTE: we cannot normally set vehicle to nullptr (rejected by OnSet callback) - //So we mirror cleanup operations and manually reset value at end - if(vehicle) - disconnectVehicle(*vehicle.value()); + disconnectVehicle(); vehicle.setValueInternal(nullptr); Object::destroying(); @@ -104,11 +102,14 @@ void TrainVehicleListItem::connectVehicle(RailVehicle &object) [this]([[maybe_unused]] Object& obj) { assert(vehicle.value().get() == &obj); - vehicle = nullptr; + auto self = shared_ptr(); + + // Remove ourselves from Train vehicles + m_parent.removeObject(self); }); } -void TrainVehicleListItem::disconnectVehicle(RailVehicle &/*object*/) +void TrainVehicleListItem::disconnectVehicle() { //Disconnect from previous vehicle m_vehiclePropertyChanged.disconnect(); diff --git a/server/src/train/trainvehiclelistitem.hpp b/server/src/train/trainvehiclelistitem.hpp index 23ff1c9e..157af349 100644 --- a/server/src/train/trainvehiclelistitem.hpp +++ b/server/src/train/trainvehiclelistitem.hpp @@ -47,7 +47,7 @@ class TrainVehicleListItem final : public Object void loaded() final; void connectVehicle(RailVehicle &object); - void disconnectVehicle(RailVehicle &); + void disconnectVehicle(); public: ObjectProperty vehicle;