mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-04-02 16:20:23 +00:00
Merge branch 'indexthemoon' into 'master'
Move Lua index helpers to components and make owner.factionRank match other ranks See merge request OpenMW/openmw!4186
This commit is contained in:
commit
d3c3d0cf44
@ -8,6 +8,7 @@
|
|||||||
#include <components/lua/l10n.hpp>
|
#include <components/lua/l10n.hpp>
|
||||||
#include <components/lua/luastate.hpp>
|
#include <components/lua/luastate.hpp>
|
||||||
#include <components/lua/serialization.hpp>
|
#include <components/lua/serialization.hpp>
|
||||||
|
#include <components/lua/util.hpp>
|
||||||
#include <components/misc/strings/algorithm.hpp>
|
#include <components/misc/strings/algorithm.hpp>
|
||||||
#include <components/misc/strings/lower.hpp>
|
#include <components/misc/strings/lower.hpp>
|
||||||
#include <components/version/version.hpp>
|
#include <components/version/version.hpp>
|
||||||
@ -33,13 +34,13 @@ namespace MWLua
|
|||||||
const std::vector<std::string>& contentList = MWBase::Environment::get().getWorld()->getContentFiles();
|
const std::vector<std::string>& contentList = MWBase::Environment::get().getWorld()->getContentFiles();
|
||||||
sol::table list(lua, sol::create);
|
sol::table list(lua, sol::create);
|
||||||
for (size_t i = 0; i < contentList.size(); ++i)
|
for (size_t i = 0; i < contentList.size(); ++i)
|
||||||
list[i + 1] = Misc::StringUtils::lowerCase(contentList[i]);
|
list[LuaUtil::toLuaIndex(i)] = Misc::StringUtils::lowerCase(contentList[i]);
|
||||||
sol::table res(lua, sol::create);
|
sol::table res(lua, sol::create);
|
||||||
res["list"] = LuaUtil::makeReadOnly(list);
|
res["list"] = LuaUtil::makeReadOnly(list);
|
||||||
res["indexOf"] = [&contentList](std::string_view contentFile) -> sol::optional<int> {
|
res["indexOf"] = [&contentList](std::string_view contentFile) -> sol::optional<int> {
|
||||||
for (size_t i = 0; i < contentList.size(); ++i)
|
for (size_t i = 0; i < contentList.size(); ++i)
|
||||||
if (Misc::StringUtils::ciEqual(contentList[i], contentFile))
|
if (Misc::StringUtils::ciEqual(contentList[i], contentFile))
|
||||||
return i + 1;
|
return LuaUtil::toLuaIndex(i);
|
||||||
return sol::nullopt;
|
return sol::nullopt;
|
||||||
};
|
};
|
||||||
res["has"] = [&contentList](std::string_view contentFile) -> bool {
|
res["has"] = [&contentList](std::string_view contentFile) -> bool {
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
|
|
||||||
#include <components/esm3/loaddial.hpp>
|
#include <components/esm3/loaddial.hpp>
|
||||||
#include <components/lua/luastate.hpp>
|
#include <components/lua/luastate.hpp>
|
||||||
|
#include <components/lua/util.hpp>
|
||||||
#include <components/misc/resourcehelpers.hpp>
|
#include <components/misc/resourcehelpers.hpp>
|
||||||
#include <components/vfs/pathutil.hpp>
|
#include <components/vfs/pathutil.hpp>
|
||||||
|
|
||||||
@ -71,7 +72,7 @@ namespace
|
|||||||
{
|
{
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
return store.at(index - 1);
|
return store.at(LuaUtil::fromLuaIndex(index));
|
||||||
},
|
},
|
||||||
[](const StoreT& store, std::string_view id) -> const ESM::Dialogue* {
|
[](const StoreT& store, std::string_view id) -> const ESM::Dialogue* {
|
||||||
return store.search(ESM::RefId::deserializeText(id));
|
return store.search(ESM::RefId::deserializeText(id));
|
||||||
@ -133,7 +134,7 @@ namespace
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
ESM::Dialogue::InfoContainer::const_iterator iter{ dialogueRecord.mInfo.cbegin() };
|
ESM::Dialogue::InfoContainer::const_iterator iter{ dialogueRecord.mInfo.cbegin() };
|
||||||
std::advance(iter, index - 1);
|
std::advance(iter, LuaUtil::fromLuaIndex(index));
|
||||||
return &(*iter);
|
return &(*iter);
|
||||||
};
|
};
|
||||||
recordInfosBindingsClass[sol::meta_function::ipairs] = lua["ipairsForArray"].template get<sol::function>();
|
recordInfosBindingsClass[sol::meta_function::ipairs] = lua["ipairsForArray"].template get<sol::function>();
|
||||||
@ -224,7 +225,7 @@ namespace
|
|||||||
{
|
{
|
||||||
return sol::nullopt;
|
return sol::nullopt;
|
||||||
}
|
}
|
||||||
return rec.mData.mRank + 1;
|
return LuaUtil::toLuaIndex(rec.mData.mRank);
|
||||||
});
|
});
|
||||||
recordInfoBindingsClass["filterPlayerCell"]
|
recordInfoBindingsClass["filterPlayerCell"]
|
||||||
= sol::readonly_property([](const ESM::DialInfo& rec) -> sol::optional<std::string> {
|
= sol::readonly_property([](const ESM::DialInfo& rec) -> sol::optional<std::string> {
|
||||||
@ -264,7 +265,7 @@ namespace
|
|||||||
{
|
{
|
||||||
return sol::nullopt;
|
return sol::nullopt;
|
||||||
}
|
}
|
||||||
return rec.mData.mPCrank + 1;
|
return LuaUtil::toLuaIndex(rec.mData.mPCrank);
|
||||||
});
|
});
|
||||||
recordInfoBindingsClass["sound"]
|
recordInfoBindingsClass["sound"]
|
||||||
= sol::readonly_property([](const ESM::DialInfo& rec) -> sol::optional<std::string> {
|
= sol::readonly_property([](const ESM::DialInfo& rec) -> sol::optional<std::string> {
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
#include <components/esm3/loadfact.hpp>
|
#include <components/esm3/loadfact.hpp>
|
||||||
#include <components/lua/luastate.hpp>
|
#include <components/lua/luastate.hpp>
|
||||||
|
#include <components/lua/util.hpp>
|
||||||
|
|
||||||
#include "../mwbase/dialoguemanager.hpp"
|
#include "../mwbase/dialoguemanager.hpp"
|
||||||
#include "../mwbase/environment.hpp"
|
#include "../mwbase/environment.hpp"
|
||||||
@ -93,8 +94,8 @@ namespace MWLua
|
|||||||
});
|
});
|
||||||
auto rankT = lua.new_usertype<FactionRank>("ESM3_FactionRank");
|
auto rankT = lua.new_usertype<FactionRank>("ESM3_FactionRank");
|
||||||
rankT[sol::meta_function::to_string] = [](const FactionRank& rec) -> std::string {
|
rankT[sol::meta_function::to_string] = [](const FactionRank& rec) -> std::string {
|
||||||
return "ESM3_FactionRank[" + rec.mFactionId.toDebugString() + ", " + std::to_string(rec.mRankIndex + 1)
|
return "ESM3_FactionRank[" + rec.mFactionId.toDebugString() + ", "
|
||||||
+ "]";
|
+ std::to_string(LuaUtil::toLuaIndex(rec.mRankIndex)) + "]";
|
||||||
};
|
};
|
||||||
rankT["name"]
|
rankT["name"]
|
||||||
= sol::readonly_property([](const FactionRank& rec) -> std::string_view { return rec.mRankName; });
|
= sol::readonly_property([](const FactionRank& rec) -> std::string_view { return rec.mRankName; });
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
#include <components/esm3/loadspel.hpp>
|
#include <components/esm3/loadspel.hpp>
|
||||||
#include <components/esm3/loadweap.hpp>
|
#include <components/esm3/loadweap.hpp>
|
||||||
#include <components/lua/luastate.hpp>
|
#include <components/lua/luastate.hpp>
|
||||||
|
#include <components/lua/util.hpp>
|
||||||
#include <components/misc/color.hpp>
|
#include <components/misc/color.hpp>
|
||||||
#include <components/misc/resourcehelpers.hpp>
|
#include <components/misc/resourcehelpers.hpp>
|
||||||
#include <components/misc/strings/format.hpp>
|
#include <components/misc/strings/format.hpp>
|
||||||
@ -207,7 +208,7 @@ namespace MWLua
|
|||||||
{
|
{
|
||||||
sol::table res(lua, sol::create);
|
sol::table res(lua, sol::create);
|
||||||
for (size_t i = 0; i < effects.size(); ++i)
|
for (size_t i = 0; i < effects.size(); ++i)
|
||||||
res[i + 1] = effects[i]; // ESM::IndexedENAMstruct (effect params)
|
res[LuaUtil::toLuaIndex(i)] = effects[i]; // ESM::IndexedENAMstruct (effect params)
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -783,7 +784,7 @@ namespace MWLua
|
|||||||
[](const ActorSpells& spells, size_t index) -> const ESM::Spell* {
|
[](const ActorSpells& spells, size_t index) -> const ESM::Spell* {
|
||||||
if (auto* store = spells.getStore())
|
if (auto* store = spells.getStore())
|
||||||
if (index <= store->count() && index > 0)
|
if (index <= store->count() && index > 0)
|
||||||
return store->at(index - 1);
|
return store->at(LuaUtil::fromLuaIndex(index));
|
||||||
return nullptr;
|
return nullptr;
|
||||||
},
|
},
|
||||||
[spellStore](const ActorSpells& spells, std::string_view spellId) -> const ESM::Spell* {
|
[spellStore](const ActorSpells& spells, std::string_view spellId) -> const ESM::Spell* {
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
#include "menuscripts.hpp"
|
#include "menuscripts.hpp"
|
||||||
|
|
||||||
|
#include <components/lua/util.hpp>
|
||||||
#include <components/misc/strings/lower.hpp>
|
#include <components/misc/strings/lower.hpp>
|
||||||
|
|
||||||
#include "../mwbase/environment.hpp"
|
#include "../mwbase/environment.hpp"
|
||||||
@ -88,7 +89,7 @@ namespace MWLua
|
|||||||
slotInfo["timePlayed"] = slot.mProfile.mTimePlayed;
|
slotInfo["timePlayed"] = slot.mProfile.mTimePlayed;
|
||||||
sol::table contentFiles(lua, sol::create);
|
sol::table contentFiles(lua, sol::create);
|
||||||
for (size_t i = 0; i < slot.mProfile.mContentFiles.size(); ++i)
|
for (size_t i = 0; i < slot.mProfile.mContentFiles.size(); ++i)
|
||||||
contentFiles[i + 1] = Misc::StringUtils::lowerCase(slot.mProfile.mContentFiles[i]);
|
contentFiles[LuaUtil::toLuaIndex(i)] = Misc::StringUtils::lowerCase(slot.mProfile.mContentFiles[i]);
|
||||||
|
|
||||||
{
|
{
|
||||||
auto system_time = std::chrono::system_clock::now()
|
auto system_time = std::chrono::system_clock::now()
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
#include "mwscriptbindings.hpp"
|
#include "mwscriptbindings.hpp"
|
||||||
|
|
||||||
#include <components/lua/luastate.hpp>
|
#include <components/lua/luastate.hpp>
|
||||||
|
#include <components/lua/util.hpp>
|
||||||
#include <components/misc/strings/lower.hpp>
|
#include <components/misc/strings/lower.hpp>
|
||||||
|
|
||||||
#include "../mwbase/environment.hpp"
|
#include "../mwbase/environment.hpp"
|
||||||
@ -174,7 +175,7 @@ namespace MWLua
|
|||||||
[](const GlobalStore& store, size_t index) -> sol::optional<float> {
|
[](const GlobalStore& store, size_t index) -> sol::optional<float> {
|
||||||
if (index < 1 || store.getSize() < index)
|
if (index < 1 || store.getSize() < index)
|
||||||
return sol::nullopt;
|
return sol::nullopt;
|
||||||
auto g = store.at(index - 1);
|
auto g = store.at(LuaUtil::fromLuaIndex(index));
|
||||||
if (g == nullptr)
|
if (g == nullptr)
|
||||||
return sol::nullopt;
|
return sol::nullopt;
|
||||||
std::string globalId = g->mId.serializeText();
|
std::string globalId = g->mId.serializeText();
|
||||||
@ -190,7 +191,7 @@ namespace MWLua
|
|||||||
[](const GlobalStore& store, size_t index, float val) {
|
[](const GlobalStore& store, size_t index, float val) {
|
||||||
if (index < 1 || store.getSize() < index)
|
if (index < 1 || store.getSize() < index)
|
||||||
return;
|
return;
|
||||||
auto g = store.at(index - 1);
|
auto g = store.at(LuaUtil::fromLuaIndex(index));
|
||||||
if (g == nullptr)
|
if (g == nullptr)
|
||||||
return;
|
return;
|
||||||
std::string globalId = g->mId.serializeText();
|
std::string globalId = g->mId.serializeText();
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
#include <components/esm3/loadnpc.hpp>
|
#include <components/esm3/loadnpc.hpp>
|
||||||
#include <components/lua/luastate.hpp>
|
#include <components/lua/luastate.hpp>
|
||||||
#include <components/lua/shapes/box.hpp>
|
#include <components/lua/shapes/box.hpp>
|
||||||
|
#include <components/lua/util.hpp>
|
||||||
#include <components/lua/utilpackage.hpp>
|
#include <components/lua/utilpackage.hpp>
|
||||||
#include <components/misc/convert.hpp>
|
#include <components/misc/convert.hpp>
|
||||||
#include <components/misc/mathutil.hpp>
|
#include <components/misc/mathutil.hpp>
|
||||||
@ -170,7 +171,7 @@ namespace MWLua
|
|||||||
listT[sol::meta_function::length] = [](const ListT& list) { return list.mIds->size(); };
|
listT[sol::meta_function::length] = [](const ListT& list) { return list.mIds->size(); };
|
||||||
listT[sol::meta_function::index] = [](const ListT& list, size_t index) -> sol::optional<ObjectT> {
|
listT[sol::meta_function::index] = [](const ListT& list, size_t index) -> sol::optional<ObjectT> {
|
||||||
if (index > 0 && index <= list.mIds->size())
|
if (index > 0 && index <= list.mIds->size())
|
||||||
return ObjectT((*list.mIds)[index - 1]);
|
return ObjectT((*list.mIds)[LuaUtil::fromLuaIndex(index)]);
|
||||||
else
|
else
|
||||||
return sol::nullopt;
|
return sol::nullopt;
|
||||||
};
|
};
|
||||||
@ -257,17 +258,16 @@ namespace MWLua
|
|||||||
};
|
};
|
||||||
ownerT["factionId"] = sol::property(getOwnerFactionId, setOwnerFactionId);
|
ownerT["factionId"] = sol::property(getOwnerFactionId, setOwnerFactionId);
|
||||||
|
|
||||||
auto getOwnerFactionRank = [](const OwnerT& o) -> sol::optional<int> {
|
auto getOwnerFactionRank = [](const OwnerT& o) -> sol::optional<size_t> {
|
||||||
int rank = o.mObj.ptr().getCellRef().getFactionRank();
|
int rank = o.mObj.ptr().getCellRef().getFactionRank();
|
||||||
if (rank < 0)
|
if (rank < 0)
|
||||||
return sol::nullopt;
|
return sol::nullopt;
|
||||||
else
|
return LuaUtil::toLuaIndex(rank);
|
||||||
return rank;
|
|
||||||
};
|
};
|
||||||
auto setOwnerFactionRank = [](const OwnerT& o, sol::optional<int> factionRank) {
|
auto setOwnerFactionRank = [](const OwnerT& o, sol::optional<size_t> factionRank) {
|
||||||
if (std::is_same_v<ObjectT, LObject> && !dynamic_cast<const SelfObject*>(&o.mObj))
|
if (std::is_same_v<ObjectT, LObject> && !dynamic_cast<const SelfObject*>(&o.mObj))
|
||||||
throw std::runtime_error("Local scripts can set an owner faction rank only on self");
|
throw std::runtime_error("Local scripts can set an owner faction rank only on self");
|
||||||
o.mObj.ptr().getCellRef().setFactionRank(factionRank.value_or(-1));
|
o.mObj.ptr().getCellRef().setFactionRank(LuaUtil::fromLuaIndex(factionRank.value_or(0)));
|
||||||
};
|
};
|
||||||
ownerT["factionRank"] = sol::property(getOwnerFactionRank, setOwnerFactionRank);
|
ownerT["factionRank"] = sol::property(getOwnerFactionRank, setOwnerFactionRank);
|
||||||
|
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
#include "postprocessingbindings.hpp"
|
#include "postprocessingbindings.hpp"
|
||||||
|
|
||||||
|
#include <components/lua/util.hpp>
|
||||||
|
|
||||||
#include "../mwbase/environment.hpp"
|
#include "../mwbase/environment.hpp"
|
||||||
#include "../mwbase/world.hpp"
|
#include "../mwbase/world.hpp"
|
||||||
#include "../mwrender/postprocessor.hpp"
|
#include "../mwrender/postprocessor.hpp"
|
||||||
@ -78,7 +80,7 @@ namespace MWLua
|
|||||||
|
|
||||||
for (size_t i = 0; i < *targetSize; ++i)
|
for (size_t i = 0; i < *targetSize; ++i)
|
||||||
{
|
{
|
||||||
sol::object obj = table[i + 1];
|
sol::object obj = table[LuaUtil::toLuaIndex(i)];
|
||||||
if (!obj.is<T>())
|
if (!obj.is<T>())
|
||||||
throw std::runtime_error("Invalid type for uniform array");
|
throw std::runtime_error("Invalid type for uniform array");
|
||||||
values.push_back(obj.as<T>());
|
values.push_back(obj.as<T>());
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
#include <components/esm/defs.hpp>
|
#include <components/esm/defs.hpp>
|
||||||
#include <components/lua/luastate.hpp>
|
#include <components/lua/luastate.hpp>
|
||||||
|
#include <components/lua/util.hpp>
|
||||||
|
|
||||||
#include "apps/openmw/mwbase/environment.hpp"
|
#include "apps/openmw/mwbase/environment.hpp"
|
||||||
#include "apps/openmw/mwbase/world.hpp"
|
#include "apps/openmw/mwbase/world.hpp"
|
||||||
@ -48,7 +49,7 @@ namespace MWLua
|
|||||||
[](const StoreT& store, size_t index) -> const T* {
|
[](const StoreT& store, size_t index) -> const T* {
|
||||||
if (index == 0 || index > store.getSize())
|
if (index == 0 || index > store.getSize())
|
||||||
return nullptr;
|
return nullptr;
|
||||||
return store.at(index - 1); // Translate from Lua's 1-based indexing.
|
return store.at(LuaUtil::fromLuaIndex(index));
|
||||||
},
|
},
|
||||||
[](const StoreT& store, std::string_view id) -> const T* {
|
[](const StoreT& store, std::string_view id) -> const T* {
|
||||||
return store.search(ESM::RefId::deserializeText(id));
|
return store.search(ESM::RefId::deserializeText(id));
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
#include <components/esm3/loadalch.hpp>
|
#include <components/esm3/loadalch.hpp>
|
||||||
#include <components/esm3/loadingr.hpp>
|
#include <components/esm3/loadingr.hpp>
|
||||||
#include <components/lua/luastate.hpp>
|
#include <components/lua/luastate.hpp>
|
||||||
|
#include <components/lua/util.hpp>
|
||||||
#include <components/misc/resourcehelpers.hpp>
|
#include <components/misc/resourcehelpers.hpp>
|
||||||
#include <components/resource/resourcesystem.hpp>
|
#include <components/resource/resourcesystem.hpp>
|
||||||
|
|
||||||
@ -57,7 +58,7 @@ namespace MWLua
|
|||||||
effect.mData.mMagnMin = 0;
|
effect.mData.mMagnMin = 0;
|
||||||
effect.mData.mMagnMax = 0;
|
effect.mData.mMagnMax = 0;
|
||||||
effect.mIndex = i;
|
effect.mIndex = i;
|
||||||
res[i + 1] = effect;
|
res[LuaUtil::toLuaIndex(i)] = effect;
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
});
|
});
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
#include "types.hpp"
|
#include "types.hpp"
|
||||||
|
|
||||||
#include <components/esm3/loadlevlist.hpp>
|
#include <components/esm3/loadlevlist.hpp>
|
||||||
|
#include <components/lua/util.hpp>
|
||||||
|
|
||||||
#include "../../mwbase/environment.hpp"
|
#include "../../mwbase/environment.hpp"
|
||||||
#include "../../mwbase/world.hpp"
|
#include "../../mwbase/world.hpp"
|
||||||
@ -45,7 +46,7 @@ namespace MWLua
|
|||||||
record["creatures"] = sol::readonly_property([&](const ESM::CreatureLevList& rec) -> sol::table {
|
record["creatures"] = sol::readonly_property([&](const ESM::CreatureLevList& rec) -> sol::table {
|
||||||
sol::table res(state, sol::create);
|
sol::table res(state, sol::create);
|
||||||
for (size_t i = 0; i < rec.mList.size(); ++i)
|
for (size_t i = 0; i < rec.mList.size(); ++i)
|
||||||
res[i + 1] = rec.mList[i];
|
res[LuaUtil::toLuaIndex(i)] = rec.mList[i];
|
||||||
return res;
|
return res;
|
||||||
});
|
});
|
||||||
record["calculateFromAllLevels"] = sol::readonly_property(
|
record["calculateFromAllLevels"] = sol::readonly_property(
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
#include <components/esm3/loadfact.hpp>
|
#include <components/esm3/loadfact.hpp>
|
||||||
#include <components/esm3/loadnpc.hpp>
|
#include <components/esm3/loadnpc.hpp>
|
||||||
#include <components/lua/luastate.hpp>
|
#include <components/lua/luastate.hpp>
|
||||||
|
#include <components/lua/util.hpp>
|
||||||
#include <components/misc/resourcehelpers.hpp>
|
#include <components/misc/resourcehelpers.hpp>
|
||||||
|
|
||||||
#include "apps/openmw/mwbase/environment.hpp"
|
#include "apps/openmw/mwbase/environment.hpp"
|
||||||
@ -145,30 +146,26 @@ namespace MWLua
|
|||||||
stats.setBaseDisposition(stats.getBaseDisposition() + value);
|
stats.setBaseDisposition(stats.getBaseDisposition() + value);
|
||||||
};
|
};
|
||||||
|
|
||||||
npc["getFactionRank"] = [](const Object& actor, std::string_view faction) {
|
npc["getFactionRank"] = [](const Object& actor, std::string_view faction) -> size_t {
|
||||||
const MWWorld::Ptr ptr = actor.ptr();
|
const MWWorld::Ptr ptr = actor.ptr();
|
||||||
ESM::RefId factionId = parseFactionId(faction);
|
ESM::RefId factionId = parseFactionId(faction);
|
||||||
|
|
||||||
const MWMechanics::NpcStats& npcStats = ptr.getClass().getNpcStats(ptr);
|
const MWMechanics::NpcStats& npcStats = ptr.getClass().getNpcStats(ptr);
|
||||||
|
|
||||||
int factionRank = npcStats.getFactionRank(factionId);
|
|
||||||
if (ptr == MWBase::Environment::get().getWorld()->getPlayerPtr())
|
if (ptr == MWBase::Environment::get().getWorld()->getPlayerPtr())
|
||||||
{
|
{
|
||||||
if (npcStats.isInFaction(factionId))
|
if (npcStats.isInFaction(factionId))
|
||||||
return factionRank + 1;
|
{
|
||||||
else
|
int factionRank = npcStats.getFactionRank(factionId);
|
||||||
return 0;
|
return LuaUtil::toLuaIndex(factionRank);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ESM::RefId primaryFactionId = ptr.getClass().getPrimaryFaction(ptr);
|
ESM::RefId primaryFactionId = ptr.getClass().getPrimaryFaction(ptr);
|
||||||
if (factionId == primaryFactionId && factionRank == -1)
|
if (factionId == primaryFactionId)
|
||||||
return ptr.getClass().getPrimaryFactionRank(ptr);
|
return LuaUtil::toLuaIndex(ptr.getClass().getPrimaryFactionRank(ptr));
|
||||||
else if (primaryFactionId == factionId)
|
|
||||||
return factionRank + 1;
|
|
||||||
else
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
npc["setFactionRank"] = [](Object& actor, std::string_view faction, int value) {
|
npc["setFactionRank"] = [](Object& actor, std::string_view faction, int value) {
|
||||||
@ -185,7 +182,7 @@ namespace MWLua
|
|||||||
if (value <= 0 || value > ranksCount)
|
if (value <= 0 || value > ranksCount)
|
||||||
throw std::runtime_error("Requested rank does not exist");
|
throw std::runtime_error("Requested rank does not exist");
|
||||||
|
|
||||||
auto targetRank = std::clamp(value, 1, ranksCount) - 1;
|
auto targetRank = LuaUtil::fromLuaIndex(std::clamp(value, 1, ranksCount));
|
||||||
|
|
||||||
if (ptr != MWBase::Environment::get().getWorld()->getPlayerPtr())
|
if (ptr != MWBase::Environment::get().getWorld()->getPlayerPtr())
|
||||||
{
|
{
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
#include <components/esm3/loadalch.hpp>
|
#include <components/esm3/loadalch.hpp>
|
||||||
#include <components/lua/luastate.hpp>
|
#include <components/lua/luastate.hpp>
|
||||||
|
#include <components/lua/util.hpp>
|
||||||
#include <components/misc/resourcehelpers.hpp>
|
#include <components/misc/resourcehelpers.hpp>
|
||||||
#include <components/resource/resourcesystem.hpp>
|
#include <components/resource/resourcesystem.hpp>
|
||||||
|
|
||||||
@ -47,7 +48,7 @@ namespace
|
|||||||
potion.mEffects.mList.resize(numEffects);
|
potion.mEffects.mList.resize(numEffects);
|
||||||
for (size_t i = 0; i < numEffects; ++i)
|
for (size_t i = 0; i < numEffects; ++i)
|
||||||
{
|
{
|
||||||
potion.mEffects.mList[i] = LuaUtil::cast<ESM::IndexedENAMstruct>(effectsTable[i + 1]);
|
potion.mEffects.mList[i] = LuaUtil::cast<ESM::IndexedENAMstruct>(effectsTable[LuaUtil::toLuaIndex(i)]);
|
||||||
}
|
}
|
||||||
potion.mEffects.updateIndexes();
|
potion.mEffects.updateIndexes();
|
||||||
}
|
}
|
||||||
@ -86,7 +87,7 @@ namespace MWLua
|
|||||||
record["effects"] = sol::readonly_property([context](const ESM::Potion& rec) -> sol::table {
|
record["effects"] = sol::readonly_property([context](const ESM::Potion& rec) -> sol::table {
|
||||||
sol::table res(context.mLua->sol(), sol::create);
|
sol::table res(context.mLua->sol(), sol::create);
|
||||||
for (size_t i = 0; i < rec.mEffects.mList.size(); ++i)
|
for (size_t i = 0; i < rec.mEffects.mList.size(); ++i)
|
||||||
res[i + 1] = rec.mEffects.mList[i]; // ESM::IndexedENAMstruct (effect params)
|
res[LuaUtil::toLuaIndex(i)] = rec.mEffects.mList[i]; // ESM::IndexedENAMstruct (effect params)
|
||||||
return res;
|
return res;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
#include "uibindings.hpp"
|
#include "uibindings.hpp"
|
||||||
|
|
||||||
|
#include <components/lua/util.hpp>
|
||||||
#include <components/lua_ui/alignment.hpp>
|
#include <components/lua_ui/alignment.hpp>
|
||||||
#include <components/lua_ui/content.hpp>
|
#include <components/lua_ui/content.hpp>
|
||||||
#include <components/lua_ui/element.hpp>
|
#include <components/lua_ui/element.hpp>
|
||||||
@ -36,16 +37,6 @@ namespace MWLua
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Lua arrays index from 1
|
|
||||||
inline size_t fromLuaIndex(size_t i)
|
|
||||||
{
|
|
||||||
return i - 1;
|
|
||||||
}
|
|
||||||
inline size_t toLuaIndex(size_t i)
|
|
||||||
{
|
|
||||||
return i + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
const std::unordered_map<MWGui::GuiMode, std::string_view> modeToName{
|
const std::unordered_map<MWGui::GuiMode, std::string_view> modeToName{
|
||||||
{ MWGui::GM_Inventory, "Interface" },
|
{ MWGui::GM_Inventory, "Interface" },
|
||||||
{ MWGui::GM_Container, "Container" },
|
{ MWGui::GM_Container, "Container" },
|
||||||
@ -149,7 +140,7 @@ namespace MWLua
|
|||||||
if (index == LuaUi::Layer::count())
|
if (index == LuaUi::Layer::count())
|
||||||
return sol::nullopt;
|
return sol::nullopt;
|
||||||
else
|
else
|
||||||
return toLuaIndex(index);
|
return LuaUtil::toLuaIndex(index);
|
||||||
};
|
};
|
||||||
layersTable["insertAfter"] = [context](
|
layersTable["insertAfter"] = [context](
|
||||||
std::string_view afterName, std::string_view name, const sol::object& opt) {
|
std::string_view afterName, std::string_view name, const sol::object& opt) {
|
||||||
@ -175,7 +166,7 @@ namespace MWLua
|
|||||||
layersMeta[sol::meta_function::length] = []() { return LuaUi::Layer::count(); };
|
layersMeta[sol::meta_function::length] = []() { return LuaUi::Layer::count(); };
|
||||||
layersMeta[sol::meta_function::index] = sol::overload(
|
layersMeta[sol::meta_function::index] = sol::overload(
|
||||||
[](const sol::object& self, size_t index) {
|
[](const sol::object& self, size_t index) {
|
||||||
index = fromLuaIndex(index);
|
index = LuaUtil::fromLuaIndex(index);
|
||||||
return LuaUi::Layer(index);
|
return LuaUi::Layer(index);
|
||||||
},
|
},
|
||||||
[layersTable](
|
[layersTable](
|
||||||
@ -242,7 +233,7 @@ namespace MWLua
|
|||||||
= [windowManager, luaManager = context.mLuaManager](sol::table modes, sol::optional<LObject> arg) {
|
= [windowManager, luaManager = context.mLuaManager](sol::table modes, sol::optional<LObject> arg) {
|
||||||
std::vector<MWGui::GuiMode> newStack(modes.size());
|
std::vector<MWGui::GuiMode> newStack(modes.size());
|
||||||
for (unsigned i = 0; i < newStack.size(); ++i)
|
for (unsigned i = 0; i < newStack.size(); ++i)
|
||||||
newStack[i] = nameToMode.at(LuaUtil::cast<std::string_view>(modes[i + 1]));
|
newStack[i] = nameToMode.at(LuaUtil::cast<std::string_view>(modes[LuaUtil::toLuaIndex(i)]));
|
||||||
luaManager->addAction(
|
luaManager->addAction(
|
||||||
[windowManager, newStack = std::move(newStack), arg = std::move(arg)]() {
|
[windowManager, newStack = std::move(newStack), arg = std::move(arg)]() {
|
||||||
MWWorld::Ptr ptr;
|
MWWorld::Ptr ptr;
|
||||||
|
20
components/lua/util.hpp
Normal file
20
components/lua/util.hpp
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
#ifndef COMPONENTS_LUA_UTIL_H
|
||||||
|
#define COMPONENTS_LUA_UTIL_H
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
namespace LuaUtil
|
||||||
|
{
|
||||||
|
// Lua arrays index from 1
|
||||||
|
constexpr inline std::int64_t fromLuaIndex(std::int64_t i)
|
||||||
|
{
|
||||||
|
return i - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr inline std::int64_t toLuaIndex(std::int64_t i)
|
||||||
|
{
|
||||||
|
return i + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
@ -10,6 +10,7 @@
|
|||||||
#include <components/misc/mathutil.hpp>
|
#include <components/misc/mathutil.hpp>
|
||||||
|
|
||||||
#include "luastate.hpp"
|
#include "luastate.hpp"
|
||||||
|
#include "util.hpp"
|
||||||
|
|
||||||
#include "shapes/box.hpp"
|
#include "shapes/box.hpp"
|
||||||
|
|
||||||
@ -143,7 +144,7 @@ namespace LuaUtil
|
|||||||
sol::table table(lua, sol::create);
|
sol::table table(lua, sol::create);
|
||||||
const auto vertices = b.vertices();
|
const auto vertices = b.vertices();
|
||||||
for (size_t i = 0; i < vertices.size(); ++i)
|
for (size_t i = 0; i < vertices.size(); ++i)
|
||||||
table[i + 1] = vertices[i];
|
table[toLuaIndex(i)] = vertices[i];
|
||||||
return table;
|
return table;
|
||||||
});
|
});
|
||||||
boxType[sol::meta_function::equal_to] = [](const Box& a, const Box& b) { return a == b; };
|
boxType[sol::meta_function::equal_to] = [](const Box& a, const Box& b) { return a == b; };
|
||||||
|
Loading…
x
Reference in New Issue
Block a user