Finish implementing LUA_PROBE
This commit is contained in:
@@ -2,9 +2,14 @@
|
||||
#include "LuaCall.h"
|
||||
#include "IntegrationGameModeBase.h"
|
||||
|
||||
static void FatalBlueprintError(const TCHAR *message) {
|
||||
FBlueprintExceptionInfo ExceptionInfo(EBlueprintExceptionType::FatalError, FText::FromString(FString(message)));
|
||||
FBlueprintCoreDelegates::ThrowScriptException(FFrame::GetThreadLocalTopStackFrame()->Object, *FFrame::GetThreadLocalTopStackFrame(), ExceptionInfo);
|
||||
}
|
||||
|
||||
static void CheckNotEmpty(const FlxStreamBuffer &sb) {
|
||||
if (sb.empty()) {
|
||||
UE_LOG(LogBlueprint, Fatal, TEXT("Must use LuaCallBegin before other LuaCall steps"));
|
||||
FatalBlueprintError(TEXT("Must use LuaCallBegin before other LuaCall steps"));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -61,6 +66,14 @@ void UlxLuaCallLibrary::LuaCallInvoke(UObject *context, AActor *place) {
|
||||
}
|
||||
|
||||
|
||||
void UlxLuaCallLibrary::LuaCallProbe(UObject *context, AActor *place) {
|
||||
AIntegrationGameModeBase *mode = AIntegrationGameModeBase::GetFromContext(context);
|
||||
FlxStreamBuffer &sb = mode->LuaCallGetBuffer();
|
||||
CheckNotEmpty(sb);
|
||||
mode->LuaCallEnd(InvocationKind::LUA_PROBE, place);
|
||||
}
|
||||
|
||||
|
||||
void UlxLuaCallLibrary::InvokeEngioMove(UObject *context, const FString &action, const FVector &xyz, double facing) {
|
||||
AIntegrationGameModeBase *mode = AIntegrationGameModeBase::GetFromContext(context);
|
||||
FlxStreamBuffer &sb = mode->LuaCallBegin();
|
||||
@@ -74,3 +87,53 @@ void UlxLuaCallLibrary::InvokeEngioMove(UObject *context, const FString &action,
|
||||
sb.write_double(facing);
|
||||
mode->LuaCallEnd(InvocationKind::LUA_INVOKE);
|
||||
}
|
||||
|
||||
|
||||
ELpxSimpleDynamicTag UlxLuaCallLibrary::LuaCallNextResultType(UObject *context) {
|
||||
AIntegrationGameModeBase *mode = AIntegrationGameModeBase::GetFromContext(context);
|
||||
FlxStreamBuffer &sb = mode->LuaCallGetResult();
|
||||
if (sb.empty()) return ELpxSimpleDynamicTag::None;
|
||||
int64_t total_reads = sb.total_reads();
|
||||
SimpleDynamicTag tag = sb.read_simple_dynamic_tag();
|
||||
sb.unread_to(total_reads);
|
||||
switch (tag) {
|
||||
case SimpleDynamicTag::STRING: return ELpxSimpleDynamicTag::String;
|
||||
case SimpleDynamicTag::NUMBER: return ELpxSimpleDynamicTag::Float;
|
||||
case SimpleDynamicTag::VECTOR: return ELpxSimpleDynamicTag::Vector;
|
||||
case SimpleDynamicTag::BOOLEAN: return ELpxSimpleDynamicTag::Boolean;
|
||||
default: return ELpxSimpleDynamicTag::None;
|
||||
}
|
||||
}
|
||||
|
||||
FString UlxLuaCallLibrary::LuaCallGetStringResult(UObject *context) {
|
||||
AIntegrationGameModeBase *mode = AIntegrationGameModeBase::GetFromContext(context);
|
||||
FlxStreamBuffer &sb = mode->LuaCallGetResult();
|
||||
SimpleDynamicTag tag = sb.read_simple_dynamic_tag();
|
||||
if (tag != SimpleDynamicTag::STRING) FatalBlueprintError(TEXT("expected lua to return a string"));
|
||||
std::string_view s = sb.read_string_view();
|
||||
return FString(s.size(), (const UTF8CHAR *)s.data());
|
||||
}
|
||||
|
||||
double UlxLuaCallLibrary::LuaCallGetFloatResult(UObject *context) {
|
||||
AIntegrationGameModeBase *mode = AIntegrationGameModeBase::GetFromContext(context);
|
||||
FlxStreamBuffer &sb = mode->LuaCallGetResult();
|
||||
SimpleDynamicTag tag = sb.read_simple_dynamic_tag();
|
||||
if (tag != SimpleDynamicTag::NUMBER) FatalBlueprintError(TEXT("expected lua to return a float"));
|
||||
return sb.read_double();
|
||||
}
|
||||
|
||||
FVector UlxLuaCallLibrary::LuaCallGetVectorResult(UObject *context) {
|
||||
AIntegrationGameModeBase *mode = AIntegrationGameModeBase::GetFromContext(context);
|
||||
FlxStreamBuffer &sb = mode->LuaCallGetResult();
|
||||
SimpleDynamicTag tag = sb.read_simple_dynamic_tag();
|
||||
if (tag != SimpleDynamicTag::VECTOR) FatalBlueprintError(TEXT("expected lua to return a vector"));
|
||||
return sb.read_fvector();
|
||||
}
|
||||
|
||||
bool UlxLuaCallLibrary::LuaCallGetBooleanResult(UObject *context) {
|
||||
AIntegrationGameModeBase *mode = AIntegrationGameModeBase::GetFromContext(context);
|
||||
FlxStreamBuffer &sb = mode->LuaCallGetResult();
|
||||
SimpleDynamicTag tag = sb.read_simple_dynamic_tag();
|
||||
if (tag != SimpleDynamicTag::BOOLEAN) FatalBlueprintError(TEXT("expected lua to return a boolean"));
|
||||
return sb.read_bool();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user