2021-03-12 18:29:51 +01:00
|
|
|
#include "luabindings.hpp"
|
|
|
|
|
2022-08-17 19:09:38 +02:00
|
|
|
#include "worldview.hpp"
|
2021-08-27 09:26:38 +02:00
|
|
|
|
2021-03-12 18:29:51 +01:00
|
|
|
namespace sol
|
|
|
|
{
|
|
|
|
template <>
|
|
|
|
struct is_automagical<MWLua::AsyncPackageId> : std::false_type
|
|
|
|
{
|
|
|
|
};
|
2022-05-15 21:30:08 +02:00
|
|
|
|
|
|
|
template <>
|
|
|
|
struct is_automagical<LuaUtil::Callback> : std::false_type
|
|
|
|
{
|
|
|
|
};
|
2021-03-12 18:29:51 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
namespace MWLua
|
|
|
|
{
|
|
|
|
|
|
|
|
struct TimerCallback
|
|
|
|
{
|
|
|
|
AsyncPackageId mAsyncId;
|
|
|
|
std::string mName;
|
|
|
|
};
|
|
|
|
|
|
|
|
sol::function getAsyncPackageInitializer(const Context& context)
|
|
|
|
{
|
2021-12-01 21:28:05 +01:00
|
|
|
using TimerType = LuaUtil::ScriptsContainer::TimerType;
|
2021-03-12 18:29:51 +01:00
|
|
|
sol::usertype<AsyncPackageId> api = context.mLua->sol().new_usertype<AsyncPackageId>("AsyncPackage");
|
|
|
|
api["registerTimerCallback"]
|
2022-10-02 12:47:33 +02:00
|
|
|
= [](const AsyncPackageId& asyncId, std::string_view name, sol::main_protected_function callback) {
|
2021-09-25 10:46:47 +02:00
|
|
|
asyncId.mContainer->registerTimerCallback(asyncId.mScriptId, name, std::move(callback));
|
2021-03-12 18:29:51 +01:00
|
|
|
return TimerCallback{ asyncId, std::string(name) };
|
2022-09-22 21:26:05 +03:00
|
|
|
};
|
2021-12-01 21:28:05 +01:00
|
|
|
api["newSimulationTimer"] = [world = context.mWorldView](const AsyncPackageId&, double delay,
|
2022-10-02 12:47:33 +02:00
|
|
|
const TimerCallback& callback, sol::main_object callbackArg) {
|
2021-03-12 18:29:51 +01:00
|
|
|
callback.mAsyncId.mContainer->setupSerializableTimer(TimerType::SIMULATION_TIME,
|
2021-12-01 21:28:05 +01:00
|
|
|
world->getSimulationTime() + delay, callback.mAsyncId.mScriptId, callback.mName,
|
2021-09-25 10:46:47 +02:00
|
|
|
std::move(callbackArg));
|
2021-03-12 18:29:51 +01:00
|
|
|
};
|
2021-12-01 21:28:05 +01:00
|
|
|
api["newGameTimer"] = [world = context.mWorldView](const AsyncPackageId&, double delay,
|
2022-10-02 12:47:33 +02:00
|
|
|
const TimerCallback& callback, sol::main_object callbackArg) {
|
2021-03-12 18:29:51 +01:00
|
|
|
callback.mAsyncId.mContainer->setupSerializableTimer(TimerType::GAME_TIME, world->getGameTime() + delay,
|
2021-09-25 10:46:47 +02:00
|
|
|
callback.mAsyncId.mScriptId, callback.mName, std::move(callbackArg));
|
2021-03-12 18:29:51 +01:00
|
|
|
};
|
2022-10-02 12:47:33 +02:00
|
|
|
api["newUnsavableSimulationTimer"] = [world = context.mWorldView](const AsyncPackageId& asyncId, double delay,
|
|
|
|
sol::main_protected_function callback) {
|
|
|
|
asyncId.mContainer->setupUnsavableTimer(
|
|
|
|
TimerType::SIMULATION_TIME, world->getSimulationTime() + delay, asyncId.mScriptId, std::move(callback));
|
|
|
|
};
|
|
|
|
api["newUnsavableGameTimer"] = [world = context.mWorldView](const AsyncPackageId& asyncId, double delay,
|
|
|
|
sol::main_protected_function callback) {
|
|
|
|
asyncId.mContainer->setupUnsavableTimer(
|
|
|
|
TimerType::GAME_TIME, world->getGameTime() + delay, asyncId.mScriptId, std::move(callback));
|
|
|
|
};
|
|
|
|
api["callback"] = [](const AsyncPackageId& asyncId, sol::main_protected_function fn) -> LuaUtil::Callback {
|
2021-10-31 17:38:06 +01:00
|
|
|
return LuaUtil::Callback{ std::move(fn), asyncId.mHiddenData };
|
2021-08-27 09:26:38 +02:00
|
|
|
};
|
2021-03-12 18:29:51 +01:00
|
|
|
|
2022-05-15 21:30:08 +02:00
|
|
|
sol::usertype<LuaUtil::Callback> callbackType = context.mLua->sol().new_usertype<LuaUtil::Callback>("Callback");
|
|
|
|
callbackType[sol::meta_function::call]
|
|
|
|
= [](const LuaUtil::Callback& callback, sol::variadic_args va) { return callback.call(sol::as_args(va)); };
|
|
|
|
|
2021-03-12 18:29:51 +01:00
|
|
|
auto initializer = [](sol::table hiddenData) {
|
2022-11-14 00:12:48 +01:00
|
|
|
LuaUtil::ScriptId id = hiddenData[LuaUtil::ScriptsContainer::sScriptIdKey];
|
2021-09-25 10:46:47 +02:00
|
|
|
return AsyncPackageId{ id.mContainer, id.mIndex, hiddenData };
|
2021-03-12 18:29:51 +01:00
|
|
|
};
|
|
|
|
return sol::make_object(context.mLua->sol(), initializer);
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|