mirror of
https://github.com/OpenMW/openmw.git
synced 2025-12-01 21:34:31 +00:00
Add validation
This commit is contained in:
parent
aa545467fd
commit
7a5fe778bc
1 changed files with 38 additions and 15 deletions
|
|
@ -32,6 +32,19 @@ namespace sol
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
|
size_t getValidRanksCount(const ESM::Faction* faction)
|
||||||
|
{
|
||||||
|
if (!faction)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
for (size_t i = 0; i < faction->mRanks.size(); i++)
|
||||||
|
{
|
||||||
|
if (faction->mRanks[i].empty())
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
return faction->mRanks.size();
|
||||||
|
}
|
||||||
ESM::NPC tableToNPC(const sol::table& rec)
|
ESM::NPC tableToNPC(const sol::table& rec)
|
||||||
{
|
{
|
||||||
ESM::NPC npc;
|
ESM::NPC npc;
|
||||||
|
|
@ -60,8 +73,16 @@ namespace
|
||||||
if (rec["hair"] != sol::nil)
|
if (rec["hair"] != sol::nil)
|
||||||
npc.mHair = ESM::RefId::deserializeText(rec["hair"].get<std::string_view>());
|
npc.mHair = ESM::RefId::deserializeText(rec["hair"].get<std::string_view>());
|
||||||
if (rec["primaryFaction"] != sol::nil)
|
if (rec["primaryFaction"] != sol::nil)
|
||||||
npc.mFaction = ESM::RefId::deserializeText(rec["primaryFaction"].get<std::string_view>());
|
{
|
||||||
|
auto factionStr = rec["primaryFaction"].get<std::string_view>();
|
||||||
|
ESM::RefId factionId = ESM::RefId::deserializeText(factionStr);
|
||||||
|
|
||||||
|
const auto& factionStore = MWBase::Environment::get().getESMStore()->get<ESM::Faction>();
|
||||||
|
if (!factionStore.search(factionId))
|
||||||
|
throw std::runtime_error("Invalid faction '" + std::string(factionStr) + "' in primaryFaction");
|
||||||
|
|
||||||
|
npc.mFaction = factionId;
|
||||||
|
}
|
||||||
if (rec["isMale"] != sol::nil)
|
if (rec["isMale"] != sol::nil)
|
||||||
{
|
{
|
||||||
bool male = rec["isMale"];
|
bool male = rec["isMale"];
|
||||||
|
|
@ -110,7 +131,22 @@ namespace
|
||||||
if (rec["primaryFactionRank"] != sol::nil)
|
if (rec["primaryFactionRank"] != sol::nil)
|
||||||
{
|
{
|
||||||
if (!npc.mFaction.empty())
|
if (!npc.mFaction.empty())
|
||||||
npc.mNpdt.mRank = LuaUtil::fromLuaIndex(rec["primaryFactionRank"]);
|
{
|
||||||
|
const ESM::RefId factionId = npc.mFaction;
|
||||||
|
const ESM::Faction* faction
|
||||||
|
= MWBase::Environment::get().getESMStore()->get<ESM::Faction>().find(factionId);
|
||||||
|
|
||||||
|
int luaValue = rec["primaryFactionRank"];
|
||||||
|
int rank = LuaUtil::fromLuaIndex(luaValue);
|
||||||
|
|
||||||
|
int maxRank = static_cast<int>(getValidRanksCount(faction));
|
||||||
|
|
||||||
|
if (rank < 0 || rank >= maxRank)
|
||||||
|
throw std::runtime_error("primaryFactionRank: Requested rank " + std::to_string(rank)
|
||||||
|
+ " is out of bounds for faction " + factionId.toDebugString());
|
||||||
|
|
||||||
|
npc.mNpdt.mRank = rank;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rec["servicesOffered"] != sol::nil)
|
if (rec["servicesOffered"] != sol::nil)
|
||||||
|
|
@ -134,19 +170,6 @@ namespace
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
size_t getValidRanksCount(const ESM::Faction* faction)
|
|
||||||
{
|
|
||||||
if (!faction)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
for (size_t i = 0; i < faction->mRanks.size(); i++)
|
|
||||||
{
|
|
||||||
if (faction->mRanks[i].empty())
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
return faction->mRanks.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
ESM::RefId parseFactionId(std::string_view faction)
|
ESM::RefId parseFactionId(std::string_view faction)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue