mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-04-02 16:20:23 +00:00
Merge branch 'esm3_ai_package' into 'master'
Use unique_ptr to manage AiPackage lifetime See merge request OpenMW/openmw!1691
This commit is contained in:
commit
4a3d7a1ff7
@ -52,8 +52,8 @@ namespace MWMechanics
|
|||||||
|
|
||||||
ESM::AiSequence::AiPackageContainer package;
|
ESM::AiSequence::AiPackageContainer package;
|
||||||
package.mType = ESM::AiSequence::Ai_Activate;
|
package.mType = ESM::AiSequence::Ai_Activate;
|
||||||
package.mPackage = activate.release();
|
package.mPackage = std::move(activate);
|
||||||
sequence.mPackages.push_back(package);
|
sequence.mPackages.push_back(std::move(package));
|
||||||
}
|
}
|
||||||
|
|
||||||
AiActivate::AiActivate(const ESM::AiSequence::AiActivate *activate)
|
AiActivate::AiActivate(const ESM::AiSequence::AiActivate *activate)
|
||||||
|
@ -460,8 +460,8 @@ namespace MWMechanics
|
|||||||
|
|
||||||
ESM::AiSequence::AiPackageContainer package;
|
ESM::AiSequence::AiPackageContainer package;
|
||||||
package.mType = ESM::AiSequence::Ai_Combat;
|
package.mType = ESM::AiSequence::Ai_Combat;
|
||||||
package.mPackage = combat.release();
|
package.mPackage = std::move(combat);
|
||||||
sequence.mPackages.push_back(package);
|
sequence.mPackages.push_back(std::move(package));
|
||||||
}
|
}
|
||||||
|
|
||||||
void AiCombatStorage::startCombatMove(bool isDistantCombat, float distToTarget, float rangeAttack, const MWWorld::Ptr& actor, const MWWorld::Ptr& target)
|
void AiCombatStorage::startCombatMove(bool isDistantCombat, float distToTarget, float rangeAttack, const MWWorld::Ptr& actor, const MWWorld::Ptr& target)
|
||||||
|
@ -109,8 +109,8 @@ namespace MWMechanics
|
|||||||
|
|
||||||
ESM::AiSequence::AiPackageContainer package;
|
ESM::AiSequence::AiPackageContainer package;
|
||||||
package.mType = ESM::AiSequence::Ai_Escort;
|
package.mType = ESM::AiSequence::Ai_Escort;
|
||||||
package.mPackage = escort.release();
|
package.mPackage = std::move(escort);
|
||||||
sequence.mPackages.push_back(package);
|
sequence.mPackages.push_back(std::move(package));
|
||||||
}
|
}
|
||||||
|
|
||||||
void AiEscort::fastForward(const MWWorld::Ptr& actor, AiState &state)
|
void AiEscort::fastForward(const MWWorld::Ptr& actor, AiState &state)
|
||||||
|
@ -217,8 +217,8 @@ void AiFollow::writeState(ESM::AiSequence::AiSequence &sequence) const
|
|||||||
|
|
||||||
ESM::AiSequence::AiPackageContainer package;
|
ESM::AiSequence::AiPackageContainer package;
|
||||||
package.mType = ESM::AiSequence::Ai_Follow;
|
package.mType = ESM::AiSequence::Ai_Follow;
|
||||||
package.mPackage = follow.release();
|
package.mPackage = std::move(follow);
|
||||||
sequence.mPackages.push_back(package);
|
sequence.mPackages.push_back(std::move(package));
|
||||||
}
|
}
|
||||||
|
|
||||||
int AiFollow::getFollowIndex() const
|
int AiFollow::getFollowIndex() const
|
||||||
|
@ -81,8 +81,8 @@ void AiPursue::writeState(ESM::AiSequence::AiSequence &sequence) const
|
|||||||
|
|
||||||
ESM::AiSequence::AiPackageContainer package;
|
ESM::AiSequence::AiPackageContainer package;
|
||||||
package.mType = ESM::AiSequence::Ai_Pursue;
|
package.mType = ESM::AiSequence::Ai_Pursue;
|
||||||
package.mPackage = pursue.release();
|
package.mPackage = std::move(pursue);
|
||||||
sequence.mPackages.push_back(package);
|
sequence.mPackages.push_back(std::move(package));
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace MWMechanics
|
} // namespace MWMechanics
|
||||||
|
@ -498,41 +498,41 @@ void AiSequence::readState(const ESM::AiSequence::AiSequence &sequence)
|
|||||||
{
|
{
|
||||||
case ESM::AiSequence::Ai_Wander:
|
case ESM::AiSequence::Ai_Wander:
|
||||||
{
|
{
|
||||||
package.reset(new AiWander(static_cast<ESM::AiSequence::AiWander*>(container.mPackage)));
|
package.reset(new AiWander(&static_cast<const ESM::AiSequence::AiWander&>(*container.mPackage)));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case ESM::AiSequence::Ai_Travel:
|
case ESM::AiSequence::Ai_Travel:
|
||||||
{
|
{
|
||||||
const auto source = static_cast<const ESM::AiSequence::AiTravel*>(container.mPackage);
|
const ESM::AiSequence::AiTravel& source = static_cast<const ESM::AiSequence::AiTravel&>(*container.mPackage);
|
||||||
if (source->mHidden)
|
if (source.mHidden)
|
||||||
package.reset(new AiInternalTravel(source));
|
package.reset(new AiInternalTravel(&source));
|
||||||
else
|
else
|
||||||
package.reset(new AiTravel(source));
|
package.reset(new AiTravel(&source));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case ESM::AiSequence::Ai_Escort:
|
case ESM::AiSequence::Ai_Escort:
|
||||||
{
|
{
|
||||||
package.reset(new AiEscort(static_cast<ESM::AiSequence::AiEscort*>(container.mPackage)));
|
package.reset(new AiEscort(&static_cast<const ESM::AiSequence::AiEscort&>(*container.mPackage)));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case ESM::AiSequence::Ai_Follow:
|
case ESM::AiSequence::Ai_Follow:
|
||||||
{
|
{
|
||||||
package.reset(new AiFollow(static_cast<ESM::AiSequence::AiFollow*>(container.mPackage)));
|
package.reset(new AiFollow(&static_cast<const ESM::AiSequence::AiFollow&>(*container.mPackage)));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case ESM::AiSequence::Ai_Activate:
|
case ESM::AiSequence::Ai_Activate:
|
||||||
{
|
{
|
||||||
package.reset(new AiActivate(static_cast<ESM::AiSequence::AiActivate*>(container.mPackage)));
|
package.reset(new AiActivate(&static_cast<const ESM::AiSequence::AiActivate&>(*container.mPackage)));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case ESM::AiSequence::Ai_Combat:
|
case ESM::AiSequence::Ai_Combat:
|
||||||
{
|
{
|
||||||
package.reset(new AiCombat(static_cast<ESM::AiSequence::AiCombat*>(container.mPackage)));
|
package.reset(new AiCombat(&static_cast<const ESM::AiSequence::AiCombat&>(*container.mPackage)));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case ESM::AiSequence::Ai_Pursue:
|
case ESM::AiSequence::Ai_Pursue:
|
||||||
{
|
{
|
||||||
package.reset(new AiPursue(static_cast<ESM::AiSequence::AiPursue*>(container.mPackage)));
|
package.reset(new AiPursue(&static_cast<const ESM::AiSequence::AiPursue&>(*container.mPackage)));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
@ -129,8 +129,8 @@ namespace MWMechanics
|
|||||||
|
|
||||||
ESM::AiSequence::AiPackageContainer package;
|
ESM::AiSequence::AiPackageContainer package;
|
||||||
package.mType = ESM::AiSequence::Ai_Travel;
|
package.mType = ESM::AiSequence::Ai_Travel;
|
||||||
package.mPackage = travel.release();
|
package.mPackage = std::move(travel);
|
||||||
sequence.mPackages.push_back(package);
|
sequence.mPackages.push_back(std::move(package));
|
||||||
}
|
}
|
||||||
|
|
||||||
AiInternalTravel::AiInternalTravel(float x, float y, float z)
|
AiInternalTravel::AiInternalTravel(float x, float y, float z)
|
||||||
|
@ -888,8 +888,8 @@ namespace MWMechanics
|
|||||||
|
|
||||||
ESM::AiSequence::AiPackageContainer package;
|
ESM::AiSequence::AiPackageContainer package;
|
||||||
package.mType = ESM::AiSequence::Ai_Wander;
|
package.mType = ESM::AiSequence::Ai_Wander;
|
||||||
package.mPackage = wander.release();
|
package.mPackage = std::move(wander);
|
||||||
sequence.mPackages.push_back(package);
|
sequence.mPackages.push_back(std::move(package));
|
||||||
}
|
}
|
||||||
|
|
||||||
AiWander::AiWander (const ESM::AiSequence::AiWander* wander)
|
AiWander::AiWander (const ESM::AiSequence::AiWander* wander)
|
||||||
|
@ -152,12 +152,6 @@ namespace AiSequence
|
|||||||
esm.writeHNT ("TARG", mTargetActorId);
|
esm.writeHNT ("TARG", mTargetActorId);
|
||||||
}
|
}
|
||||||
|
|
||||||
AiSequence::~AiSequence()
|
|
||||||
{
|
|
||||||
for (std::vector<AiPackageContainer>::iterator it = mPackages.begin(); it != mPackages.end(); ++it)
|
|
||||||
delete it->mPackage;
|
|
||||||
}
|
|
||||||
|
|
||||||
void AiSequence::save(ESMWriter &esm) const
|
void AiSequence::save(ESMWriter &esm) const
|
||||||
{
|
{
|
||||||
for (std::vector<AiPackageContainer>::const_iterator it = mPackages.begin(); it != mPackages.end(); ++it)
|
for (std::vector<AiPackageContainer>::const_iterator it = mPackages.begin(); it != mPackages.end(); ++it)
|
||||||
@ -166,25 +160,25 @@ namespace AiSequence
|
|||||||
switch (it->mType)
|
switch (it->mType)
|
||||||
{
|
{
|
||||||
case Ai_Wander:
|
case Ai_Wander:
|
||||||
static_cast<const AiWander*>(it->mPackage)->save(esm);
|
static_cast<const AiWander&>(*it->mPackage).save(esm);
|
||||||
break;
|
break;
|
||||||
case Ai_Travel:
|
case Ai_Travel:
|
||||||
static_cast<const AiTravel*>(it->mPackage)->save(esm);
|
static_cast<const AiTravel&>(*it->mPackage).save(esm);
|
||||||
break;
|
break;
|
||||||
case Ai_Escort:
|
case Ai_Escort:
|
||||||
static_cast<const AiEscort*>(it->mPackage)->save(esm);
|
static_cast<const AiEscort&>(*it->mPackage).save(esm);
|
||||||
break;
|
break;
|
||||||
case Ai_Follow:
|
case Ai_Follow:
|
||||||
static_cast<const AiFollow*>(it->mPackage)->save(esm);
|
static_cast<const AiFollow&>(*it->mPackage).save(esm);
|
||||||
break;
|
break;
|
||||||
case Ai_Activate:
|
case Ai_Activate:
|
||||||
static_cast<const AiActivate*>(it->mPackage)->save(esm);
|
static_cast<const AiActivate&>(*it->mPackage).save(esm);
|
||||||
break;
|
break;
|
||||||
case Ai_Combat:
|
case Ai_Combat:
|
||||||
static_cast<const AiCombat*>(it->mPackage)->save(esm);
|
static_cast<const AiCombat&>(*it->mPackage).save(esm);
|
||||||
break;
|
break;
|
||||||
case Ai_Pursue:
|
case Ai_Pursue:
|
||||||
static_cast<const AiPursue*>(it->mPackage)->save(esm);
|
static_cast<const AiPursue&>(*it->mPackage).save(esm);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@ -212,7 +206,7 @@ namespace AiSequence
|
|||||||
{
|
{
|
||||||
std::unique_ptr<AiWander> ptr = std::make_unique<AiWander>();
|
std::unique_ptr<AiWander> ptr = std::make_unique<AiWander>();
|
||||||
ptr->load(esm);
|
ptr->load(esm);
|
||||||
mPackages.back().mPackage = ptr.release();
|
mPackages.back().mPackage = std::move(ptr);
|
||||||
++count;
|
++count;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -220,7 +214,7 @@ namespace AiSequence
|
|||||||
{
|
{
|
||||||
std::unique_ptr<AiTravel> ptr = std::make_unique<AiTravel>();
|
std::unique_ptr<AiTravel> ptr = std::make_unique<AiTravel>();
|
||||||
ptr->load(esm);
|
ptr->load(esm);
|
||||||
mPackages.back().mPackage = ptr.release();
|
mPackages.back().mPackage = std::move(ptr);
|
||||||
++count;
|
++count;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -228,7 +222,7 @@ namespace AiSequence
|
|||||||
{
|
{
|
||||||
std::unique_ptr<AiEscort> ptr = std::make_unique<AiEscort>();
|
std::unique_ptr<AiEscort> ptr = std::make_unique<AiEscort>();
|
||||||
ptr->load(esm);
|
ptr->load(esm);
|
||||||
mPackages.back().mPackage = ptr.release();
|
mPackages.back().mPackage = std::move(ptr);
|
||||||
++count;
|
++count;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -236,7 +230,7 @@ namespace AiSequence
|
|||||||
{
|
{
|
||||||
std::unique_ptr<AiFollow> ptr = std::make_unique<AiFollow>();
|
std::unique_ptr<AiFollow> ptr = std::make_unique<AiFollow>();
|
||||||
ptr->load(esm);
|
ptr->load(esm);
|
||||||
mPackages.back().mPackage = ptr.release();
|
mPackages.back().mPackage = std::move(ptr);
|
||||||
++count;
|
++count;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -244,7 +238,7 @@ namespace AiSequence
|
|||||||
{
|
{
|
||||||
std::unique_ptr<AiActivate> ptr = std::make_unique<AiActivate>();
|
std::unique_ptr<AiActivate> ptr = std::make_unique<AiActivate>();
|
||||||
ptr->load(esm);
|
ptr->load(esm);
|
||||||
mPackages.back().mPackage = ptr.release();
|
mPackages.back().mPackage = std::move(ptr);
|
||||||
++count;
|
++count;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -252,14 +246,14 @@ namespace AiSequence
|
|||||||
{
|
{
|
||||||
std::unique_ptr<AiCombat> ptr = std::make_unique<AiCombat>();
|
std::unique_ptr<AiCombat> ptr = std::make_unique<AiCombat>();
|
||||||
ptr->load(esm);
|
ptr->load(esm);
|
||||||
mPackages.back().mPackage = ptr.release();
|
mPackages.back().mPackage = std::move(ptr);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case Ai_Pursue:
|
case Ai_Pursue:
|
||||||
{
|
{
|
||||||
std::unique_ptr<AiPursue> ptr = std::make_unique<AiPursue>();
|
std::unique_ptr<AiPursue> ptr = std::make_unique<AiPursue>();
|
||||||
ptr->load(esm);
|
ptr->load(esm);
|
||||||
mPackages.back().mPackage = ptr.release();
|
mPackages.back().mPackage = std::move(ptr);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
@ -274,15 +268,15 @@ namespace AiSequence
|
|||||||
for(auto& pkg : mPackages)
|
for(auto& pkg : mPackages)
|
||||||
{
|
{
|
||||||
if(pkg.mType == Ai_Wander)
|
if(pkg.mType == Ai_Wander)
|
||||||
static_cast<AiWander*>(pkg.mPackage)->mData.mShouldRepeat = true;
|
static_cast<AiWander&>(*pkg.mPackage).mData.mShouldRepeat = true;
|
||||||
else if(pkg.mType == Ai_Travel)
|
else if(pkg.mType == Ai_Travel)
|
||||||
static_cast<AiTravel*>(pkg.mPackage)->mRepeat = true;
|
static_cast<AiTravel&>(*pkg.mPackage).mRepeat = true;
|
||||||
else if(pkg.mType == Ai_Escort)
|
else if(pkg.mType == Ai_Escort)
|
||||||
static_cast<AiEscort*>(pkg.mPackage)->mRepeat = true;
|
static_cast<AiEscort&>(*pkg.mPackage).mRepeat = true;
|
||||||
else if(pkg.mType == Ai_Follow)
|
else if(pkg.mType == Ai_Follow)
|
||||||
static_cast<AiFollow*>(pkg.mPackage)->mRepeat = true;
|
static_cast<AiFollow&>(*pkg.mPackage).mRepeat = true;
|
||||||
else if(pkg.mType == Ai_Activate)
|
else if(pkg.mType == Ai_Activate)
|
||||||
static_cast<AiActivate*>(pkg.mPackage)->mRepeat = true;
|
static_cast<AiActivate&>(*pkg.mPackage).mRepeat = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
#include "components/esm/defs.hpp"
|
#include "components/esm/defs.hpp"
|
||||||
|
|
||||||
@ -149,7 +150,7 @@ namespace ESM
|
|||||||
{
|
{
|
||||||
int mType;
|
int mType;
|
||||||
|
|
||||||
AiPackage* mPackage;
|
std::unique_ptr<AiPackage> mPackage;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct AiSequence
|
struct AiSequence
|
||||||
@ -158,7 +159,6 @@ namespace ESM
|
|||||||
{
|
{
|
||||||
mLastAiPackage = -1;
|
mLastAiPackage = -1;
|
||||||
}
|
}
|
||||||
~AiSequence();
|
|
||||||
|
|
||||||
std::vector<AiPackageContainer> mPackages;
|
std::vector<AiPackageContainer> mPackages;
|
||||||
int mLastAiPackage;
|
int mLastAiPackage;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user