mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-05-09 12:07:51 +03:00
Add travel service support for creatures (Fixes #2432)
This commit is contained in:
parent
457c135097
commit
e30f240ba2
10 changed files with 140 additions and 42 deletions
|
@ -15,6 +15,7 @@ namespace ESM {
|
|||
mAiPackage.mList.clear();
|
||||
mInventory.mList.clear();
|
||||
mSpells.mList.clear();
|
||||
mTransport.mList.clear();
|
||||
|
||||
mScale = 1.f;
|
||||
mHasAI = false;
|
||||
|
@ -59,6 +60,10 @@ namespace ESM {
|
|||
esm.getHExact(&mAiData, sizeof(mAiData));
|
||||
mHasAI = true;
|
||||
break;
|
||||
case ESM::FourCC<'D','O','D','T'>::value:
|
||||
case ESM::FourCC<'D','N','A','M'>::value:
|
||||
mTransport.add(esm);
|
||||
break;
|
||||
case AI_Wander:
|
||||
case AI_Activate:
|
||||
case AI_Escort:
|
||||
|
@ -94,6 +99,7 @@ namespace ESM {
|
|||
if (mHasAI) {
|
||||
esm.writeHNT("AIDT", mAiData, sizeof(mAiData));
|
||||
}
|
||||
mTransport.save(esm);
|
||||
mAiPackage.save(esm);
|
||||
}
|
||||
|
||||
|
@ -120,5 +126,11 @@ namespace ESM {
|
|||
mAiData.blank();
|
||||
mAiData.mServices = 0;
|
||||
mAiPackage.mList.clear();
|
||||
mTransport.mList.clear();
|
||||
}
|
||||
|
||||
const std::vector<Transport::Dest>& Creature::getTransport() const
|
||||
{
|
||||
return mTransport.mList;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
#include "loadcont.hpp"
|
||||
#include "spelllist.hpp"
|
||||
#include "aipackage.hpp"
|
||||
#include "transport.hpp"
|
||||
|
||||
namespace ESM
|
||||
{
|
||||
|
@ -92,6 +93,9 @@ struct Creature
|
|||
bool mHasAI;
|
||||
AIData mAiData;
|
||||
AIPackageList mAiPackage;
|
||||
Transport mTransport;
|
||||
|
||||
const std::vector<Transport::Dest>& getTransport() const;
|
||||
|
||||
void load(ESMReader &esm);
|
||||
void save(ESMWriter &esm) const;
|
||||
|
|
|
@ -14,7 +14,7 @@ namespace ESM
|
|||
|
||||
mSpells.mList.clear();
|
||||
mInventory.mList.clear();
|
||||
mTransport.clear();
|
||||
mTransport.mList.clear();
|
||||
mAiPackage.mList.clear();
|
||||
|
||||
bool hasNpdt = false;
|
||||
|
@ -81,14 +81,8 @@ namespace ESM
|
|||
mHasAI= true;
|
||||
break;
|
||||
case ESM::FourCC<'D','O','D','T'>::value:
|
||||
{
|
||||
Dest dodt;
|
||||
esm.getHExact(&dodt.mPos, 24);
|
||||
mTransport.push_back(dodt);
|
||||
break;
|
||||
}
|
||||
case ESM::FourCC<'D','N','A','M'>::value:
|
||||
mTransport.back().mCellName = esm.getHString();
|
||||
mTransport.add(esm);
|
||||
break;
|
||||
case AI_Wander:
|
||||
case AI_Activate:
|
||||
|
@ -131,11 +125,8 @@ namespace ESM
|
|||
esm.writeHNT("AIDT", mAiData, sizeof(mAiData));
|
||||
}
|
||||
|
||||
typedef std::vector<Dest>::const_iterator DestIter;
|
||||
for (DestIter it = mTransport.begin(); it != mTransport.end(); ++it) {
|
||||
esm.writeHNT("DODT", it->mPos, sizeof(it->mPos));
|
||||
esm.writeHNOCString("DNAM", it->mCellName);
|
||||
}
|
||||
mTransport.save(esm);
|
||||
|
||||
mAiPackage.save(esm);
|
||||
}
|
||||
|
||||
|
@ -177,7 +168,7 @@ namespace ESM
|
|||
mSpells.mList.clear();
|
||||
mAiData.blank();
|
||||
mHasAI = false;
|
||||
mTransport.clear();
|
||||
mTransport.mList.clear();
|
||||
mAiPackage.mList.clear();
|
||||
mName.clear();
|
||||
mModel.clear();
|
||||
|
@ -198,4 +189,9 @@ namespace ESM
|
|||
else // NPC_DEFAULT
|
||||
return mNpdt52.mRank;
|
||||
}
|
||||
|
||||
const std::vector<Transport::Dest>& NPC::getTransport() const
|
||||
{
|
||||
return mTransport.mList;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
#include "aipackage.hpp"
|
||||
#include "spelllist.hpp"
|
||||
#include "loadskil.hpp"
|
||||
#include "transport.hpp"
|
||||
|
||||
namespace ESM {
|
||||
|
||||
|
@ -98,12 +99,6 @@ struct NPC
|
|||
char mUnknown1, mUnknown2, mUnknown3;
|
||||
int mGold;
|
||||
}; // 12 bytes
|
||||
|
||||
struct Dest
|
||||
{
|
||||
Position mPos;
|
||||
std::string mCellName;
|
||||
};
|
||||
#pragma pack(pop)
|
||||
|
||||
unsigned char mNpdtType;
|
||||
|
@ -122,7 +117,10 @@ struct NPC
|
|||
AIData mAiData;
|
||||
bool mHasAI;
|
||||
|
||||
std::vector<Dest> mTransport;
|
||||
Transport mTransport;
|
||||
|
||||
const std::vector<Transport::Dest>& getTransport() const;
|
||||
|
||||
AIPackageList mAiPackage;
|
||||
|
||||
std::string mId, mName, mModel, mRace, mClass, mFaction, mScript;
|
||||
|
|
33
components/esm/transport.cpp
Normal file
33
components/esm/transport.cpp
Normal file
|
@ -0,0 +1,33 @@
|
|||
#include "transport.hpp"
|
||||
|
||||
#include <components/esm/esmreader.hpp>
|
||||
#include <components/esm/esmwriter.hpp>
|
||||
|
||||
namespace ESM
|
||||
{
|
||||
|
||||
void Transport::add(ESMReader &esm)
|
||||
{
|
||||
if (esm.retSubName().val == ESM::FourCC<'D','O','D','T'>::value)
|
||||
{
|
||||
Dest dodt;
|
||||
esm.getHExact(&dodt.mPos, 24);
|
||||
mList.push_back(dodt);
|
||||
}
|
||||
else if (esm.retSubName().val == ESM::FourCC<'D','N','A','M'>::value)
|
||||
{
|
||||
mList.back().mCellName = esm.getHString();
|
||||
}
|
||||
}
|
||||
|
||||
void Transport::save(ESMWriter &esm) const
|
||||
{
|
||||
typedef std::vector<Dest>::const_iterator DestIter;
|
||||
for (DestIter it = mList.begin(); it != mList.end(); ++it)
|
||||
{
|
||||
esm.writeHNT("DODT", it->mPos, sizeof(it->mPos));
|
||||
esm.writeHNOCString("DNAM", it->mCellName);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
36
components/esm/transport.hpp
Normal file
36
components/esm/transport.hpp
Normal file
|
@ -0,0 +1,36 @@
|
|||
#ifndef OPENMW_COMPONENTS_ESM_TRANSPORT_H
|
||||
#define OPENMW_COMPONENTS_ESM_TRANSPORT_H
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include "defs.hpp"
|
||||
|
||||
namespace ESM
|
||||
{
|
||||
|
||||
class ESMReader;
|
||||
class ESMWriter;
|
||||
|
||||
/// List of travel service destination. Shared by CREA and NPC_ records.
|
||||
struct Transport
|
||||
{
|
||||
|
||||
struct Dest
|
||||
{
|
||||
Position mPos;
|
||||
std::string mCellName;
|
||||
};
|
||||
|
||||
std::vector<Dest> mList;
|
||||
|
||||
/// Load one destination, assumes the subrecord name was already read
|
||||
void add(ESMReader &esm);
|
||||
|
||||
void save(ESMWriter &esm) const;
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
Loading…
Add table
Add a link
Reference in a new issue