#include "RE/BSScript/IVirtualMachine.h"
#include "RE/BSScript/Internal/VirtualMachine.h"
// 1) The initial callback signature:
BSScript::LatentStatus StartGIFCapture(
RE::BSScript::Internal::VirtualMachine* vm,
VMStackID stackID,
RE::StaticFunctionTag*, // standard first param
float durationSeconds,
std::int32_t fps
) {
// Kick off your async capture (on another thread or via timers).
// Store 'vm' and 'stackID' in your capture manager, so you can
// return to the right script stack once done.
CaptureManager::Get().Begin(
durationSeconds,
fps,
[vm, stackID](bool success) {
// 3) Return to Papyrus when frames are all saved:
vm->ReturnFromLatent(stackID, success);
}
);
// 2) Tell the VM “I’m latent—don’t resume yet”:
return BSScript::LatentStatus::kLatent;
}
// Plugin registration:
bool BindPapyrusFunctions(RE::BSScript::IVirtualMachine* vm) {
// Register as a latent function:
vm->RegisterLatentFunction(
"StartGIFCapture", // Papyrus function name
"MyScreenGrabScript", // Your .psc ScriptName
StartGIFCapture // Callback above
);
return true;
}
extern "C" DLLEXPORT bool SKSEPlugin_Load(const SKSE::LoadInterface* skse) {
SKSE::Init(skse);
SKSE::GetPapyrusInterface()->Register(BindPapyrusFunctions);
return true;
}