diff --git a/server/src/train/trainvehiclelist.cpp b/server/src/train/trainvehiclelist.cpp index db8bdeaa..c8d71a35 100644 --- a/server/src/train/trainvehiclelist.cpp +++ b/server/src/train/trainvehiclelist.cpp @@ -100,6 +100,8 @@ void TrainVehicleList::load(WorldLoader& loader, const nlohmann::json& data) nlohmann::json objects = state.value("items", nlohmann::json::array()); if(!objects.empty()) { + m_propertyChanged.clear(); + std::vector> values; for(const auto& object : objects.items()) { @@ -113,8 +115,37 @@ void TrainVehicleList::load(WorldLoader& loader, const nlohmann::json& data) } else break; - } - items.load(std::move(values)); + } + items.load(std::move(values)); + } + else + { + //! \todo Remove in v0.4 + objects = data.value("objects", nlohmann::json::array()); + std::vector oldItems; + oldItems.reserve(objects.size()); + for(auto& [_, id] : objects.items()) + { + static_cast(_); // silence unused warning + if(ObjectPtr item = loader.getObject(id.get())) + oldItems.emplace_back(std::move(item)); + } + + m_propertyChanged.clear(); + for(auto& item : oldItems) + { + std::shared_ptr vehicle = std::dynamic_pointer_cast(item); + if(!vehicle) + continue; + + std::shared_ptr object; + object = std::make_shared(vehicle, *this, getItemId()); + object->vehicle.setValueInternal(vehicle); + object->vehicle->trains.appendInternal(parent().shared_ptr()); + + items.appendInternal(object); + m_propertyChanged.emplace(object.get(), object->propertyChanged.connect(std::bind(&TrainVehicleList::propertyChanged, this, std::placeholders::_1))); + } } SubObject::load(loader, data); rowCountChanged();