diff --git a/apps/openmw/mwmechanics/aipackage.hpp b/apps/openmw/mwmechanics/aipackage.hpp index a09362baaa..873ad1c299 100644 --- a/apps/openmw/mwmechanics/aipackage.hpp +++ b/apps/openmw/mwmechanics/aipackage.hpp @@ -1,6 +1,8 @@ #ifndef GAME_MWMECHANICS_AIPACKAGE_H #define GAME_MWMECHANICS_AIPACKAGE_H +#include + #include #include "pathfinding.hpp" @@ -59,7 +61,7 @@ namespace MWMechanics virtual ~AiPackage() = default; ///Clones the package - virtual AiPackage *clone() const = 0; + virtual std::unique_ptr clone() const = 0; /// Updates and runs the package (Should run every frame) /// \return Package completed? diff --git a/apps/openmw/mwmechanics/aisequence.cpp b/apps/openmw/mwmechanics/aisequence.cpp index 00d44202a0..8ed1f0beec 100644 --- a/apps/openmw/mwmechanics/aisequence.cpp +++ b/apps/openmw/mwmechanics/aisequence.cpp @@ -27,7 +27,7 @@ void AiSequence::copy (const AiSequence& sequence) { for (std::list::const_iterator iter (sequence.mPackages.begin()); iter!=sequence.mPackages.end(); ++iter) - mPackages.push_back ((*iter)->clone()); + mPackages.push_back ((*iter)->clone().release()); // We need to keep an AiWander storage, if present - it has a state machine. // Not sure about another temporary storages @@ -288,7 +288,7 @@ void AiSequence::execute (const MWWorld::Ptr& actor, CharacterController& charac if (isActualAiPackage(packageTypeId) && (mRepeat || package->getRepeat())) { package->reset(); - mPackages.push_back(package->clone()); + mPackages.push_back(package->clone().release()); } // To account for the rare case where AiPackage::execute() queued another AI package // (e.g. AiPursue executing a dialogue script that uses startCombat) @@ -380,12 +380,12 @@ void AiSequence::stack (const AiPackage& package, const MWWorld::Ptr& actor, boo if((*it)->getPriority() <= package.getPriority()) { - mPackages.insert(it,package.clone()); + mPackages.insert(it,package.clone().release()); return; } } - mPackages.push_back (package.clone()); + mPackages.push_back (package.clone().release()); // Make sure that temporary storage is empty if (cancelOther) diff --git a/apps/openmw/mwmechanics/typedaipackage.hpp b/apps/openmw/mwmechanics/typedaipackage.hpp index 2801accc4c..e2b5f8688e 100644 --- a/apps/openmw/mwmechanics/typedaipackage.hpp +++ b/apps/openmw/mwmechanics/typedaipackage.hpp @@ -8,9 +8,9 @@ namespace MWMechanics template struct TypedAiPackage : public AiPackage { - virtual TypedAiPackage *clone() const override + virtual std::unique_ptr clone() const override { - return new T(*static_cast(this)); + return std::make_unique(*static_cast(this)); } }; }