| 61 | } |
| 62 | |
| 63 | sol::function getAsyncPackageInitializer( |
| 64 | lua_State* state, std::function<double()> simulationTimeFn, std::function<double()> gameTimeFn) |
| 65 | { |
| 66 | sol::state_view lua(state); |
| 67 | using TimerType = ScriptsContainer::TimerType; |
| 68 | sol::usertype<AsyncPackageId> api = lua.new_usertype<AsyncPackageId>("AsyncPackage"); |
| 69 | api["registerTimerCallback"] |
| 70 | = [](const AsyncPackageId& asyncId, std::string_view name, sol::main_protected_function callback) { |
| 71 | asyncId.mContainer->registerTimerCallback(asyncId.mScriptId, name, std::move(callback)); |
| 72 | return TimerCallback{ asyncId, std::string(name) }; |
| 73 | }; |
| 74 | api["newSimulationTimer"] = [simulationTimeFn](const AsyncPackageId&, double delay, |
| 75 | const TimerCallback& callback, sol::main_object callbackArg) { |
| 76 | callback.mAsyncId.mContainer->setupSerializableTimer(TimerType::SIMULATION_TIME, simulationTimeFn() + delay, |
| 77 | callback.mAsyncId.mScriptId, callback.mName, std::move(callbackArg)); |
| 78 | }; |
| 79 | api["newGameTimer"] = [gameTimeFn](const AsyncPackageId&, double delay, const TimerCallback& callback, |
| 80 | sol::main_object callbackArg) { |
| 81 | callback.mAsyncId.mContainer->setupSerializableTimer(TimerType::GAME_TIME, gameTimeFn() + delay, |
| 82 | callback.mAsyncId.mScriptId, callback.mName, std::move(callbackArg)); |
| 83 | }; |
| 84 | api["newUnsavableSimulationTimer"] |
| 85 | = [simulationTimeFn](const AsyncPackageId& asyncId, double delay, sol::main_protected_function callback) { |
| 86 | asyncId.mContainer->setupUnsavableTimer( |
| 87 | TimerType::SIMULATION_TIME, simulationTimeFn() + delay, asyncId.mScriptId, std::move(callback)); |
| 88 | }; |
| 89 | api["newUnsavableGameTimer"] |
| 90 | = [gameTimeFn](const AsyncPackageId& asyncId, double delay, sol::main_protected_function callback) { |
| 91 | asyncId.mContainer->setupUnsavableTimer( |
| 92 | TimerType::GAME_TIME, gameTimeFn() + delay, asyncId.mScriptId, std::move(callback)); |
| 93 | }; |
| 94 | |
| 95 | sol::table callbackMeta = Callback::makeMetatable(state); |
| 96 | api["callback"] = [callbackMeta](const AsyncPackageId& asyncId, sol::main_protected_function fn) -> sol::table { |
| 97 | return Callback::make(asyncId, std::move(fn), callbackMeta); |
| 98 | }; |
| 99 | |
| 100 | auto initializer = [](sol::table hiddenData) { |
| 101 | ScriptId id = hiddenData[ScriptsContainer::sScriptIdKey]; |
| 102 | return AsyncPackageId{ id.mContainer, id.mIndex, std::move(hiddenData) }; |
| 103 | }; |
| 104 | return sol::make_object(lua, initializer); |
| 105 | } |
| 106 | |
| 107 | } |