diff --git a/docs/docs/01-intro/01-overview.md b/docs/docs/01-intro/01-overview.md
index 7fabbae90b1..ed99af4c1b9 100644
--- a/docs/docs/01-intro/01-overview.md
+++ b/docs/docs/01-intro/01-overview.md
@@ -402,6 +402,49 @@ ctx.procedures.makeRequest().then(
);
```
+
+
+
+An Unreal C++ [client](#client) can call a procedure defined by a Rust or TypeScript module:
+
+```cpp
+{
+...
+ // Call the procedure without a callback
+ Context.Procedures->MakeRequest({});
+}
+
+```
+
+A Unreal C++ [client](#client) can also register a callback to run when a procedure call finishes, which will be invoked with that procedure's return value:
+
+```cpp
+{
+...
+ FOnMakeRequestComplete Callback;
+ BIND_DELEGATE_SAFE(Callback, this, AGameManager, OnMakeRequestComplete);
+ Context.Procedures->MakeRequest(Callback);
+}
+
+// Make sure to mark any callback functions as UFUNCTION() or they will not be executed
+void AGameManager::OnMakeRequestComplete(const FProcedureEventContext& Context, const FString& Result, bool bSuccess)
+{
+ UE_LOG(LogTemp, Log, TEXT("Procedure `MakeRequest` returned %s"), *Result);
+}
+
+```
+
+
+
+
+An Unreal C++ [client](#client) can call a procedure defined by a Rust or TypeScript module:
+
+
+
+A Unreal C++ [client](#client) can also register a callback to run when a procedure call finishes, which will be invoked with that procedure's return value:
+
+
+
diff --git a/docs/docs/11-Procedures/01-overview.md b/docs/docs/11-Procedures/01-overview.md
index f8acb7887e1..5698ce250c8 100644
--- a/docs/docs/11-Procedures/01-overview.md
+++ b/docs/docs/11-Procedures/01-overview.md
@@ -458,6 +458,22 @@ Clients can invoke procedures using methods on `ctx.procedures`:
ctx.procedures.insertAValue({ a: 12, b: "Foo" });
```
+
+
+
+Clients can invoke procedures using methods on `ctx.Procedures`:
+
+```cpp
+Context.Procedures->InsertAValue(12, TEXT("Foo"), {});
+```
+
+
+
+
+Clients can invoke procedures using methods on `ctx.Procedures`:
+
+
+
@@ -485,7 +501,7 @@ That callback will have access to the return value of the procedure,
or an error if the procedure fails.
```csharp
-ctx.Procedures.AddTwoNumbers(12, "Foo", (ctx, result) =>
+ctx.Procedures.AddTwoNumbers(1, 2, (ctx, result) =>
{
if (result.IsSuccess)
{
@@ -509,5 +525,47 @@ ctx.procedures.addTwoNumbers({ lhs: 1, rhs: 2 }).then(
);
```
+
+
+
+A client can also invoke a procedure while registering a callback to run when it completes.
+That callback will have access to the return value of the procedure,
+or an error if the procedure fails.
+
+```cpp
+{
+ ...
+ FOnAddTwoNumbersComplete ReturnCallback;
+ BIND_DELEGATE_SAFE(ReturnCallback, this, AGameManager, OnAddTwoNumbersComplete);
+ Context.Procedures->AddTwoNumbers(1, 2, ReturnCallback);
+}
+
+void AGameManager::OnAddTwoNumbersComplete(const FProcedureEventContext& Context, int32 Result, bool bSuccess)
+{
+ if (bSuccess)
+ {
+ UE_LOG(LogTemp, Log, TEXT("1 + 2 = %d"), Result);
+ }
+ else
+ {
+ if (Context.Event.Status.IsInternalError())
+ {
+ UE_LOG(LogTemp, Error, TEXT("Error: %s"), *Context.Event.Status.GetAsInternalError());
+ return;
+ }
+ UE_LOG(LogTemp, Error, TEXT("Out of energy!"));
+ }
+}
+```
+
+
+
+
+A client can also invoke a procedure while registering a callback to run when it completes.
+That callback will have access to the return value of the procedure,
+or an error if the procedure fails.
+
+
+
diff --git a/docs/static/images/unreal/intro/ue-blueprint-makerequest-nocallback.png b/docs/static/images/unreal/intro/ue-blueprint-makerequest-nocallback.png
new file mode 100644
index 00000000000..0965eac3dff
Binary files /dev/null and b/docs/static/images/unreal/intro/ue-blueprint-makerequest-nocallback.png differ
diff --git a/docs/static/images/unreal/intro/ue-blueprint-makerequest-with-callback.png b/docs/static/images/unreal/intro/ue-blueprint-makerequest-with-callback.png
new file mode 100644
index 00000000000..da6727ad247
Binary files /dev/null and b/docs/static/images/unreal/intro/ue-blueprint-makerequest-with-callback.png differ
diff --git a/docs/static/images/unreal/procedures/ue-blueprint-calling-procedure.png b/docs/static/images/unreal/procedures/ue-blueprint-calling-procedure.png
new file mode 100644
index 00000000000..0995bae53fc
Binary files /dev/null and b/docs/static/images/unreal/procedures/ue-blueprint-calling-procedure.png differ
diff --git a/docs/static/images/unreal/procedures/ue-blueprint-procedure-callback.png b/docs/static/images/unreal/procedures/ue-blueprint-procedure-callback.png
new file mode 100644
index 00000000000..5eb7d0b970b
Binary files /dev/null and b/docs/static/images/unreal/procedures/ue-blueprint-procedure-callback.png differ
diff --git a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/Connection/Callback.h b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/Connection/Callback.h
index f8c8d61fa8b..6905446c09f 100644
--- a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/Connection/Callback.h
+++ b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/Connection/Callback.h
@@ -680,40 +680,36 @@ class SPACETIMEDBSDK_API USpacetimeDBProcedureStatusBpLib : public UBlueprintFun
}
UFUNCTION(BlueprintPure, Category = "SpacetimeDB|ProcedureStatus")
- static bool IsReturned(const FProcedureStatusType& InValue) { return InValue.IsReturned(); }
+ static bool IsReturned(const FSpacetimeDBProcedureStatus& InValue) { return InValue.IsReturned(); }
- UFUNCTION(BlueprintPure, Category = "SpacetimeDB|ProcedureStatus")
- static TArray GetAsReturned(const FProcedureStatusType& InValue)
- {
- return InValue.GetAsReturned();
- }
+ // We don't allow the raw value to be exported as GetAsReturned() from the ProcedureEventContext.
UFUNCTION(BlueprintCallable, Category = "SpacetimeDB|ProcedureStatus")
- static FProcedureStatusType OutOfEnergy(const FSpacetimeDBUnit& InValue)
+ static FSpacetimeDBProcedureStatus OutOfEnergy(const FSpacetimeDBUnit& InValue)
{
- return FProcedureStatusType::OutOfEnergy(InValue);
+ return FSpacetimeDBProcedureStatus::OutOfEnergy(InValue);
}
UFUNCTION(BlueprintPure, Category = "SpacetimeDB|ProcedureStatus")
- static bool IsOutOfEnergy(const FProcedureStatusType& InValue) { return InValue.IsOutOfEnergy(); }
+ static bool IsOutOfEnergy(const FSpacetimeDBProcedureStatus& InValue) { return InValue.IsOutOfEnergy(); }
UFUNCTION(BlueprintPure, Category = "SpacetimeDB|ProcedureStatus")
- static FSpacetimeDBUnit GetAsOutOfEnergy(const FProcedureStatusType& InValue)
+ static FSpacetimeDBUnit GetAsOutOfEnergy(const FSpacetimeDBProcedureStatus& InValue)
{
return InValue.GetAsOutOfEnergy();
}
UFUNCTION(BlueprintCallable, Category = "SpacetimeDB|ProcedureStatus")
- static FProcedureStatusType InternalError(const FString& InValue)
+ static FSpacetimeDBProcedureStatus InternalError(const FString& InValue)
{
- return FProcedureStatusType::InternalError(InValue);
+ return FSpacetimeDBProcedureStatus::InternalError(InValue);
}
UFUNCTION(BlueprintPure, Category = "SpacetimeDB|ProcedureStatus")
- static bool IsInternalError(const FProcedureStatusType& InValue) { return InValue.IsInternalError(); }
+ static bool IsInternalError(const FSpacetimeDBProcedureStatus& InValue) { return InValue.IsInternalError(); }
UFUNCTION(BlueprintPure, Category = "SpacetimeDB|ProcedureStatus")
- static FString GetAsInternalError(const FProcedureStatusType& InValue)
+ static FString GetAsInternalError(const FSpacetimeDBProcedureStatus& InValue)
{
return InValue.GetAsInternalError();
}