More work on the LuaCall interface

This commit is contained in:
2024-09-04 23:15:13 -04:00
parent 8c75a5f826
commit ede234fc8a
5 changed files with 37 additions and 49 deletions

View File

@@ -141,38 +141,32 @@ void AIntegrationGameModeBase::UpdateTangibles() {
TangibleManager->DeleteFarawayTangibles(); TangibleManager->DeleteFarawayTangibles();
} }
// void AIntegrationGameModeBase::InvokeEngioMove(const FString &action, const FVector &xyz, double facing) { void AIntegrationGameModeBase::LuaCallEnd(InvocationKind kind, int64 place_id) {
// FTCHARToUTF8 utf8action(action);
// std::string uaction(utf8action.Get(), utf8action.Length());
// FlxStreamBuffer sb;
// sb.write_string("engio");
// sb.write_string("move");
// sb.write_simple_dynamic_tag(SimpleDynamicTag::STRING);
// sb.write_string(uaction);
// sb.write_simple_dynamic_tag(SimpleDynamicTag::VECTOR);
// sb.write_fvector(xyz);
// sb.write_simple_dynamic_tag(SimpleDynamicTag::NUMBER);
// sb.write_double(facing);
// std::string_view datapk = sb.view();
// FlxLockedWrapper w(LockableWrapper);
// int64 player = w.GetActor();
// w->play_call_function_lua_call(w.Get(), player, datapk.size(), datapk.data());
// }
void AIntegrationGameModeBase::LuaCallInvoke(AActor *place) {
std::string_view datapk = LuaCallBuffer.view(); std::string_view datapk = LuaCallBuffer.view();
FlxLockedWrapper w(LockableWrapper); FlxLockedWrapper w(LockableWrapper);
int64_t place_id = w.GetActor(); if (place_id == 0) place_id = w.GetActor();
if (place != nullptr) { uint32_t retpklen;
place_id = UlxTangible::GetActorTangible(place)->TangibleId; const char *retpk;
w->play_call_function(w.Get(), kind, place_id, datapk.size(), datapk.data(), &retpklen, &retpk);
LuaCallResult.open(std::string_view(retpk, retpklen));
}
void AIntegrationGameModeBase::LuaCallEnd(InvocationKind kind) {
LuaCallEnd(kind, int64(0));
}
void AIntegrationGameModeBase::LuaCallEnd(InvocationKind kind, AActor *place) {
if (place == nullptr) {
LuaCallEnd(kind, int64(0));
} else {
LuaCallEnd(kind, UlxTangible::GetActorTangible(place)->TangibleId);
} }
w.PlayCallFunction(InvocationKind::LUA_CALL, place_id, datapk);
} }
void AIntegrationGameModeBase::ExecuteDebuggingCommand(FlxLockedWrapper &w, const FString &fs) { void AIntegrationGameModeBase::ExecuteDebuggingCommand(FlxLockedWrapper &w, const FString &fs) {
if (fs == "\\invokeplayer") { if (fs == "\\invokeplayer") {
DPrint(TEXT("Trying to invoke 'myfunction' in lua")); DPrint(TEXT("Trying to invoke 'myfunction' in lua"));
FlxStreamBuffer sb; FlxStreamBuffer &sb = LuaCallBegin();
sb.write_string("engio"); sb.write_string("engio");
sb.write_string("myfunction"); sb.write_string("myfunction");
sb.write_simple_dynamic_tag(SimpleDynamicTag::NUMBER); sb.write_simple_dynamic_tag(SimpleDynamicTag::NUMBER);
@@ -181,9 +175,7 @@ void AIntegrationGameModeBase::ExecuteDebuggingCommand(FlxLockedWrapper &w, cons
sb.write_string("Howdy"); sb.write_string("Howdy");
sb.write_simple_dynamic_tag(SimpleDynamicTag::VECTOR); sb.write_simple_dynamic_tag(SimpleDynamicTag::VECTOR);
sb.write_fvector(FVector(2,3,4)); sb.write_fvector(FVector(2,3,4));
std::string_view datapk = sb.view(); LuaCallEnd(InvocationKind::LUA_INVOKE);
int64 player = w.GetActor();
w.PlayCallFunction(InvocationKind::LUA_CALL, player, datapk);
} else { } else {
ConsoleOutput.AppendLine(TEXT("Unknown Command")); ConsoleOutput.AppendLine(TEXT("Unknown Command"));
} }

View File

@@ -46,15 +46,22 @@ public:
// Assemble a lua call. To call into lua: // Assemble a lua call. To call into lua:
// //
// * Use LuaCallBegin // * Use LuaCallBegin
// * Get the lua call buffer. // * Get the lua call buffer:
// * Add a class name and a function name to the buffer. // - add a class name
// * Add parameters to the buffer. // - add a function name
// * Use LuaCallInvoke. // - add function parameters
// * Use LuaCallEnd.
// * Get the lua call result.
// - parse out any return values
// //
void LuaCallBegin() { LuaCallBuffer.clear(); } FlxStreamBuffer &LuaCallBegin() { LuaCallBuffer.clear(); return LuaCallBuffer; }
FlxStreamBuffer &LuaCallGetBuffer() { return LuaCallBuffer; } FlxStreamBuffer &LuaCallGetBuffer() { return LuaCallBuffer; }
void LuaCallInvoke(AActor *place); void LuaCallEnd(InvocationKind kind);
void LuaCallEnd(InvocationKind kind, int64 place_id);
void LuaCallEnd(InvocationKind kind, AActor *place);
FlxStreamBuffer &LuaCallGetResult() { return LuaCallResult; }
void LuaCallClear() { LuaCallBuffer.clear(); LuaCallResult.clear(); }
// Execute a debugging command, typed on the GUI. // Execute a debugging command, typed on the GUI.
void ExecuteDebuggingCommand(FlxLockedWrapper &w, const FString &fs); void ExecuteDebuggingCommand(FlxLockedWrapper &w, const FString &fs);
@@ -89,6 +96,7 @@ public:
// The Lua Call assembly buffer. // The Lua Call assembly buffer.
FlxStreamBuffer LuaCallBuffer; FlxStreamBuffer LuaCallBuffer;
FlxStreamBuffer LuaCallResult;
// This utility runs the luprex update and socket update in a thread. // This utility runs the luprex update and socket update in a thread.
FTriggeredTask LuprexUpdateTask; FTriggeredTask LuprexUpdateTask;

View File

@@ -50,13 +50,6 @@ IdView FlxLockedWrapper::GetNear(int64 id, double rx, double ry, double rz) {
return IdView(data, size); 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) { StringViewVec FlxLockedWrapper::GetAnimationQueues(IdView ids) {
// How many animation queues are we fetching? // How many animation queues are we fetching?
int num = ids.Num(); int num = ids.Num();

View File

@@ -84,10 +84,6 @@ public:
// //
IdView GetNear(int64 id, double rx, double ry, double rz); IdView GetNear(int64 id, double rx, double ry, double rz);
// PlayCallFunction - a thin wrapper around play_call_function.
//
std::string_view PlayCallFunction(InvocationKind kind, int64 place, std::string_view datapk);
// Get animation queues. // Get animation queues.
// //
// The array returned by this is valid until the // The array returned by this is valid until the

View File

@@ -57,14 +57,13 @@ void UlxLuaCallLibrary::LuaCallInvoke(UObject *context, AActor *place) {
AIntegrationGameModeBase *mode = AIntegrationGameModeBase::GetFromContext(context); AIntegrationGameModeBase *mode = AIntegrationGameModeBase::GetFromContext(context);
FlxStreamBuffer &sb = mode->LuaCallGetBuffer(); FlxStreamBuffer &sb = mode->LuaCallGetBuffer();
CheckNotEmpty(sb); CheckNotEmpty(sb);
mode->LuaCallInvoke(place); mode->LuaCallEnd(InvocationKind::LUA_INVOKE, place);
} }
void UlxLuaCallLibrary::InvokeEngioMove(UObject *context, const FString &action, const FVector &xyz, double facing) { void UlxLuaCallLibrary::InvokeEngioMove(UObject *context, const FString &action, const FVector &xyz, double facing) {
AIntegrationGameModeBase *mode = AIntegrationGameModeBase::GetFromContext(context); AIntegrationGameModeBase *mode = AIntegrationGameModeBase::GetFromContext(context);
FlxStreamBuffer &sb = mode->LuaCallGetBuffer(); FlxStreamBuffer &sb = mode->LuaCallBegin();
mode->LuaCallBegin();
sb.write_string("engio"); sb.write_string("engio");
sb.write_string("move"); sb.write_string("move");
sb.write_simple_dynamic_tag(SimpleDynamicTag::STRING); sb.write_simple_dynamic_tag(SimpleDynamicTag::STRING);
@@ -73,5 +72,5 @@ void UlxLuaCallLibrary::InvokeEngioMove(UObject *context, const FString &action,
sb.write_fvector(xyz); sb.write_fvector(xyz);
sb.write_simple_dynamic_tag(SimpleDynamicTag::NUMBER); sb.write_simple_dynamic_tag(SimpleDynamicTag::NUMBER);
sb.write_double(facing); sb.write_double(facing);
mode->LuaCallInvoke(nullptr); mode->LuaCallEnd(InvocationKind::LUA_INVOKE);
} }