87 lines
2.6 KiB
C++
87 lines
2.6 KiB
C++
|
|
#include "LockedWrapper.h"
|
|
#include "DebugPrint.h"
|
|
#include "lpx-drvutil.hpp"
|
|
#include "lpx-paths.hpp"
|
|
|
|
using namespace CommonTypes;
|
|
|
|
void FlxLockedWrapper::InitWrapper() {
|
|
if (Lockable.Wrapper.play_initialize != nullptr) {
|
|
// Already initialized.
|
|
return;
|
|
}
|
|
FString dll((const UTF8CHAR*)LUPREX_DLL_PATH);
|
|
DebugPrint::DPrint(dll);
|
|
void* DLL = FPlatformProcess::GetDllHandle(*dll);
|
|
if (DLL != nullptr) {
|
|
using InitFn = void (*)(EngineWrapper*);
|
|
InitFn init = (InitFn)FPlatformProcess::GetDllExport(DLL, TEXT("init_engine_wrapper"));
|
|
if (init != nullptr) {
|
|
init(&Lockable.Wrapper);
|
|
Lockable.Wrapper.hook_dprint(DebugPrint::DPrint);
|
|
}
|
|
}
|
|
}
|
|
|
|
FString FlxLockedWrapper::FetchStdout() {
|
|
uint32_t ndata; const char* data;
|
|
Lockable.Wrapper.get_outgoing(Get(), 0, &ndata, &data);
|
|
|
|
if (ndata == 0) {
|
|
return FString();
|
|
}
|
|
|
|
std::string_view src(data, ndata);
|
|
int consumed;
|
|
std::u16string cps = drvutil::utf8_to_ucs2(src, &consumed);
|
|
Lockable.Wrapper.play_sent_outgoing(Get(), 0, consumed);
|
|
return FString(cps.size(), (const UCS2CHAR*)(&cps[0]));
|
|
}
|
|
|
|
int64 FlxLockedWrapper::GetActor() {
|
|
return Lockable.Wrapper.get_actor_id(Get());
|
|
}
|
|
|
|
IdView FlxLockedWrapper::GetNear(int64 id, double rx, double ry, double rz) {
|
|
uint32 size;
|
|
int64* data;
|
|
Lockable.Wrapper.get_tangibles_near(Get(), id, rx, ry, rz, &size, (int64_t**)&data);
|
|
return IdView(data, size);
|
|
}
|
|
|
|
std::string_view FlxLockedWrapper::PlayCallFunction(InvocationKind kind, int64 place, std::string_view datapk) {
|
|
uint32_t retpklen;
|
|
const char *retpk;
|
|
Lockable.Wrapper.play_call_function(Get(), kind, place, datapk.size(), datapk.data(), &retpklen, &retpk);
|
|
return std::string_view(retpk, retpklen);
|
|
}
|
|
|
|
StringViewVec FlxLockedWrapper::GetAnimationQueues(IdView ids) {
|
|
// How many animation queues are we fetching?
|
|
int num = ids.Num();
|
|
|
|
// Enlarge the static buffers if necessary.
|
|
// Add a little extra space so we don't have to enlarge
|
|
// the buffers every time we get a new tangible.
|
|
if (num > Lockable.AQLenBuffer.Num()) {
|
|
Lockable.AQLenBuffer.SetNum(num + 1000);
|
|
Lockable.AQStrBuffer.SetNum(num + 1000);
|
|
}
|
|
|
|
// Get pointers to the static buffers.
|
|
uint32* LenBuf = Lockable.AQLenBuffer.GetData();
|
|
const char** StrBuf = Lockable.AQStrBuffer.GetData();
|
|
|
|
// Get the animation queues into the static buffers.
|
|
Lockable.Wrapper.get_animation_queues(Get(), num, (const int64_t *)ids.GetData(), LenBuf, StrBuf);
|
|
|
|
// Transfer data from static buffers into an array of string_view
|
|
StringViewVec result;
|
|
result.SetNum(num);
|
|
for (int i = 0; i < num; i++) {
|
|
result[i] = std::string_view(StrBuf[i], LenBuf[i]);
|
|
}
|
|
return result;
|
|
}
|